内核管道和clEnqueueReadBuffer

时间:2015-11-04 13:26:42

标签: 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再次运行是否安全 覆盖主机上正在处理的数据?

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

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

谢谢!

1 个答案:

答案 0 :(得分:2)

这是OpenCL 1.2规范对使用CL_MEM_USE_HOST_PTR创建的缓冲区所说的内容:

  

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

这意味着从主机和设备同时访问此缓冲区是不安全的(除非两者都只是读取)。如果您希望主机和设备分配不同,只需创建缓冲区,而不用 CL_MEM_USE_HOST_PTR标志。