Opencl 非阻塞写入顺序队列

Opencl 非阻塞写入顺序队列,opencl,gpgpu,Opencl,Gpgpu,我用CL\u MEM\u USE\u HOST\u PTR | CL\u MEM\u READ\u WRITE标志创建了一个缓冲区。我在一个内核中使用了它,然后在创建缓冲区时将(queue.enqueueReadBuffer(…))数据下载回主机内存集。我已经在CPU上修改了这些数据,现在我想在另一个内核中使用它们。 当我使用非阻塞写入手动上载(queue.enqueueWriteBuffer)数据,然后使用此缓冲区作为参数将内核排入队列时,它返回了CL\u OUT\u OF\u RESOURC

我用
CL\u MEM\u USE\u HOST\u PTR | CL\u MEM\u READ\u WRITE
标志创建了一个缓冲区。我在一个内核中使用了它,然后在创建缓冲区时将(
queue.enqueueReadBuffer(…)
)数据下载回主机内存集。我已经在CPU上修改了这些数据,现在我想在另一个内核中使用它们。 当我使用非阻塞写入手动上载(
queue.enqueueWriteBuffer
)数据,然后使用此缓冲区作为参数将内核排入队列时,它返回了
CL\u OUT\u OF\u RESOURCES
错误。阻止写入就可以了

为什么会这样?我认为阻塞/非阻塞版本只控制在
enqueueWriteBuffer
调用返回后我是否可以使用CPU上的内存,在顺序队列中,内核应该没有区别。 第二个问题是我是否必须手动上传它-
CL\u MEM\u USE\u HOST\u PTR
是否意味着每次内核使用缓冲区作为参数时,数据都必须从主机上传到设备?由于我需要手动下载数据,上面提到的标志有什么优点吗


谢谢

我不能确定您的
CL\u OUT\u of\u RESOURCES
错误的具体问题。这个错误似乎是针对系统中的问题提出的,因此您得到的实际错误可能是由程序中的其他内容(可能是内核)引起的

关于使用
CL\u MEM\u USE\u HOST\u PTR
,您仍然需要手动上传数据。OpenCL规范规定:

仅当主机ptr不为空时,此标志才有效。如有指明, 指示应用程序希望OpenCL实现使用 主机ptr引用的内存作为内存的存储位 对象允许OpenCL实现缓存缓冲区 设备内存中主机\u ptr指向的内容。此缓存副本可以 在设备上执行内核时使用

对于某些设备,数据将缓存在设备内存中。为了同步数据,您必须使用一些
clenqueueredbuffer
/
clEnqueueWriteBuffer
clenqueueemapbuffer
/
clenqueueunambuffer
。对于离散的CPU+GPU组合(即单独的GPU卡),我不确定执行
CL\u MEM\u USE\u HOST\u PTR
会有什么好处,因为数据无论如何都会被缓存

阅读规范后,使用
clenqueueumpbuffer
/
clenqueuenmapuffer
而不是
clenqueueredbuffer
/
clEnqueueWriteBuffer
可能会带来一些性能上的好处,但我还没有对任何实际设备进行测试

祝你好运