2013-12-13 2 views
1

Предположим, что я для ядра вычислил работу.Нужно ли вводить в очередь чтение/запись при использовании CL_MEM_USE_HOST_PTR?

мне было интересно, если при выделении буфера с использованием флага CL_MEM_USE_HOST_PTR, необходимо использовать enqueueRead/запись на буфере, или же они могут всегда быть опущены?

Примечание

Я в курсе этой записки по ссылке:

Calling clEnqueueReadBuffer читать область объекта буфера с значение аргумента PTR установлен в host_ptr + смещение, где host_ptr является указателем в области памяти, указанном при чтении объекта буфера с CL_MEM_USE_HOST_PTR, для удовлетворения неопределенного поведения должны соответствовать следующие :

  1. Все команды, которые используют этот объект буфера закончили выполнение перед командой чтения начинается выполнение
  2. Объект буфера не отображается
  3. Объект буфер не используется какой-либо командной очереди, пока команда чтения не имеет завершил выполнение

Таким образом, чтобы прояснить мой вопрос, я разделил его на две части:

  1. если я создаю буфер, используя флаг CL_MEM_USE_HOST_PTR, могу ли я предположить, что реализация OpenCL будет записывать в кеш устройства в случае необходимости, поэтому я могу всегда избегать enqueueWriteBuffer()?
  2. если я вызываю event.wait() после запуска ядра, могу ли я всегда избегать enqueueReadBuffer() для доступа к вычисленным данным в буфере, созданном с флагом CL_MEM_USE_HOST_PTR?

Возможно, я переусердствую об этом, но даже если в описании флага ясно указано, что память хоста будет использоваться для хранения данных, это не ясно (или я не нашел, где это очищается) о том, когда данные доступны, и если чтение/запись всегда неявно.

+1

Я думаю, что это ОЧЕНЬ хороший вопрос, потому что точное поведение MAP/UNMAP/READ/WRITE не определено должным образом в стандарте. Например, руководство nVIDIA для закрепленной памяти говорит: сначала создайте буфер, затем HOST-буфер (используя ALLOC_HOST_PTR), затем создайте карту этого последнего буфера. Затем выполните clRead() из обычного буфера в отображаемый указатель. Это объясняется где угодно в спецификации? – DarkZeros

+1

Я согласен, и я думаю, что это RIDICULOUS, что API, который был доступен в течение этого времени, неправильно определяет, что делают операции с памятью. «О, графический драйвер справляется с этим», спасибо gee. Чтобы ответить на ваш вопрос, я думаю, что ответ «не обязательно». У меня никогда не было проблемы с согласованностью, используя createbuffer с флагом CL_MEM_HOST_PTR, запустив ядро ​​с помощью setArg (buffer) этого буфера, а затем запустив enqueueReadBuffer после завершения ядра. Я думаю, что этот подход может привести к некоторым проблемам с производительностью, в зависимости от реализации. –

ответ

2

Вам не придется использовать enqueueWriteBuffer(), однако вам нужно использовать enqueueMapBuffer.

См. http://www.khronos.org/registry/cl/specs/opencl-1.2.pdf страница 89 (это то же самое и в 1.1).

Данные доступны только после того, как вы нанесли на карту объект и снова будете не определены после того, как вы удалите объект. Также эта старая статья http://www.khronos.org/message_boards/showthread.php/6912-Clarify-CL_MEM_USE_HOST_PTR содержит довольно полезное описание.

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