Неблокирующая запись в очередь по порядку - PullRequest
1 голос
/ 24 октября 2011

У меня есть буфер, созданный с CL_MEM_USE_HOST_PTR | CL_MEM_READ_WRITE флажками.Я использовал это в одном ядре, а затем загрузил (queue.enqueueReadBuffer(...)) данные обратно в набор памяти хоста, когда был создан буфер.Я изменил эти данные на процессоре, и теперь я хотел бы использовать их в другом ядре.Когда я загрузил (queue.enqueueWriteBuffer) данные вручную, используя неблокирующую запись, а затем поставил в ядро ​​ядро ​​с этим буфером в качестве аргумента, он вернул ошибку CL_OUT_OF_RESOURCES.Блокировка записи была просто отличной.

Почему это произошло?Я думал, что блокирующая / неблокирующая версия контролирует только то, могу ли я работать с памятью на ЦП после возврата вызова enqueueWriteBuffer, с упорядоченной очередью для ядра не должно быть никакой разницы.Второй вопрос: нужно ли вообще загружать его вручную - означает ли CL_MEM_USE_HOST_PTR, что данные должны загружаться с хоста на устройство каждый раз, когда какое-либо ядро ​​использует буфер в качестве аргумента?Поскольку мне приходится загружать данные вручную, когда они мне нужны, имеет ли вышеупомянутый флаг какие-либо плюсы?

Спасибо

1 Ответ

1 голос
/ 16 ноября 2011

Я не могу быть уверен в конкретной проблеме вашей ошибки CL_OUT_OF_RESOURCES.Эта ошибка, как представляется, является своего рода универсальным решением проблем в системе, поэтому фактическая ошибка, которую вы получаете, может быть вызвана чем-то другим в вашей программе (возможно, ядром).

В отношениичтобы использовать CL_MEM_USE_HOST_PTR, вам все равно придется вручную загружать данные.Спецификация OpenCL гласит:

Этот флаг действителен, только если host_ptr не NULL.Если указано, это означает, что приложение хочет, чтобы реализация OpenCL использовала память, на которую ссылается host_ptr, в качестве битов хранения для объекта памяти.Реализациям OpenCL разрешено кэшировать содержимое буфера, на которое указывает host_ptr, в памяти устройства.Эта кэшированная копия может использоваться, когда ядра выполняются на устройстве.

Для некоторых устройств данные будут кэшироваться в памяти устройства.Чтобы синхронизировать ваши данные, вам нужно будет использовать clEnqueueReadBuffer / clEnqueueWriteBuffer или clEnqueueMapBuffer / clEnqueueUnmapBuffer.Для дискретных комбинаций CPU + GPU (то есть отдельной карты GPU) я не уверен, какую выгоду принесет CL_MEM_USE_HOST_PTR, так как данные все равно будут кэшироваться.

После прочтения спецификации может быть некоторое повышение производительности при использовании clEnqueueMapBuffer / clEnqueueUnmapBuffer вместо clEnqueueReadBuffer / clEnqueueWriteBuffer, но я не проверял это ни для каких реальных устройств.

Удачи!

...