2011-10-23 116 views
1

我有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意味着数据在被上传从主机到设备的每一个部分,内核利用缓冲区作为参数的时间?由于我需要时手动下载数据,上面提到的标志有没有什么优点?

感谢

回答

1

我不能肯定你CL_OUT_OF_RESOURCES错误的特定问题。这个错误似乎在系统中出现了一些问题,所以你得到的实际错误可能是由程序中的其他内容(也许是内核)引起的。

在关于使用CL_MEM_USE_HOST_PTR,你仍然还是要手动上传数据。 OpenCL规范指出:

此标志仅在host_ptr不为NULL时有效。如果指定,它 表明应用程序希望OpenCL实现使用 内存host_ptr引用作为存储 对象存储位。 OpenCL实现可以缓存设备内存中由host_ptr指向的内容缓冲区 。当在设备上执行内核时,可以使用此缓存副本 。

对于某些设备,数据将被缓存在设备内存中。为了同步你的数据,你将不得不使用一些clEnqueueReadBuffer/clEnqueueWriteBufferclEnqueueMapBuffer/clEnqueueUnmapBuffer。对于独立的CPU + GPU组合(即独立GPU卡),我不确定这会对CL_MEM_USE_HOST_PTR有什么好处,因为无论如何都会缓存数据。

在阅读说明书,可能有一些性能优势,使用clEnqueueMapBuffer/clEnqueueUnmapBuffer,而不是clEnqueueReadBuffer/clEnqueueWriteBuffer,但我没有测试这对任何真正的设备。

祝你好运!