Opencl 内核管道和clenqueueradbuffer

Opencl 内核管道和clenqueueradbuffer,opencl,Opencl,我有一系列内核: 1) 内核A将数据写入缓冲区X 2) 缓冲区X通过clEnqueueReadBuffer复制到主机 3) 在由clEnqueueReadBuffer触发的回调中处理主机数据 重复上述内容 使用以下标志创建缓冲区X: CL_MEM_USE_HOST_PTR | CL_MEM_READ_WRITE; | CL_MEM_HOST_READ_ONLY 我的问题是:一旦完成了clEnqueueReadBuffer(我有一个由CL_complete触发的事件),内核A在没有备份的情况下

我有一系列内核:

1) 内核A将数据写入缓冲区X

2) 缓冲区X通过clEnqueueReadBuffer复制到主机

3) 在由clEnqueueReadBuffer触发的回调中处理主机数据

重复上述内容

使用以下标志创建缓冲区X:

 CL_MEM_USE_HOST_PTR | CL_MEM_READ_WRITE; | CL_MEM_HOST_READ_ONLY
我的问题是:一旦完成了clEnqueueReadBuffer(我有一个由CL_complete触发的事件),内核A在没有备份的情况下再次运行是否安全 是否覆盖主机上正在处理的数据

或者我应该在允许内核A再次运行之前处理主机上的数据吗

因为我在代码中看到一个bug,表明在我处理主机上的数据之前,内核运行是不安全的


谢谢

这就是OpenCL 1.2规范对使用
CL\u MEM\u USE\u HOST\u PTR创建的缓冲区的说明:

如果指定,则表示应用程序希望OpenCL实现使用host_ptr引用的内存作为内存对象的存储位


这意味着从主机和设备同时访问该缓冲区是不安全的(除非两者都只是读取)。如果您希望主机和设备分配是不同的,只需创建不带
CL\u MEM\u USE\u host\u PTR
标志的缓冲区即可。

太棒了,非常感谢。我想我下次应该RTFM:)如果我用
CL\u MEM\u USE\u HOST\u PTR
创建缓冲区,我甚至需要调用
clenqueueradbuffer
?不,你不需要。酷。感谢您的帮助。您至少需要映射缓冲区,否则无法保证数据已写入内存。它可以缓存在系统的其他地方。CL_MEM_USE_HOST_PTR只能真正保证地图的目标位置是一致的。