2013-10-09 4 views
0

Возможно ли освободить память хоста, созданную clEnqueueMapBuffer?Очистка буфера OpenCL clEnqueueMapBuffer

Например, создать буферную память и карта хоста:

cl_mem buffer = clCreateBuffer(...); 
    float* dataPtr = (float*)clEnqueueMapBuffer(...,buffer,...); 

У некоторых OpenCL материал, а затем очистки:

clEnqueueUnmapMemObject(...,buffer,(void *)dataPtr,...); 
    clReleaseMemObject(buffer); 

Однако, на данный момент dataPtr не является нулевым. Как вы освобождаете память на хосте, выделенном clEnqueueMapBuffer? Удалить и бесплатно не работать, и я не могу найти ничего в документации OpenCL, которая предоставляет средства для освобождения буфера.

ответ

2

Как мне известно, clEnqueueMapBuffer фактически не выделяет память как таковой, но отображает определенный диапазон адресов на хосте, чтобы он выглядел как память хоста, но на самом деле имел в виду память устройства. Это означает, что он не нуждается в освобождении, поскольку в первую очередь не было выделено памяти (новый/стиль malloc) от clEnqueueMapBuffer

+2

Джеймс, спасибо за ваш вклад. Я пошел вперед и сделал небольшой вычислительный эксперимент, чтобы увидеть, что на самом деле происходит в физической памяти на хосте. Оказывается, clEnqueueMapBuffer фактически выделяет память. Также выясняется, что clEnqueueUnmapMemObject фактически освобождает эту память и просто не устанавливает указатель на нуль. – SimpleLikeAnEgg

+0

Действительно ли это распределение памяти, или просто резервирование некоторого пространства виртуальной памяти, которое может выглядеть как выделение памяти? –

+0

Это фактически распределение памяти. Используя диспетчер задач в Windows, я смог отслеживать объем использования физической памяти каждый раз, когда я создал буфер карты. Нет ничего особенного в float *, который позволил бы ему напрямую записываться в память устройства. Фактически, вы должны вызвать clEnqueueWriteBuffer до того, как хост-буфер будет передан на устройство. – SimpleLikeAnEgg

Смежные вопросы