我有一个用CL_MEM_USE_HOST_PTR | CL_MEM_READ_WRITE
标志创建的缓冲区。我在一个内核中使用了它,然后在创建缓冲区时将数据下载(queue.enqueueReadBuffer(...)
)回主机内存集。我已经在CPU上修改了这些数据,现在我想在另一个内核中使用它们。
当我使用非阻塞写入手动上载(queue.enqueueWriteBuffer
)数据,然后将此缓冲区作为参数排入内核时,它返回CL_OUT_OF_RESOURCES
错误。阻止写就好了。
为什么会这样?我认为阻塞/非阻塞版本仅控制在enqueueWriteBuffer
调用返回后我是否可以使用CPU上的内存,而有序队列对内核应该没有区别。
第二个问题是我是否必须手动上传它 - CL_MEM_USE_HOST_PTR
是否意味着每次某些内核使用缓冲区作为参数时数据必须从主机上传到设备?因为我必须在需要时手动下载数据,上面提到了任何专业人士的标志吗?
由于
答案 0 :(得分:1)
我无法确定您的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
可能会有一些性能优势,但我没有对此进行测试真实的设备。
祝你好运!