Я не могу быть уверен в конкретной проблеме вашей ошибки 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
, но я не проверял это ни для каких реальных устройств.
Удачи!