我有一个内核管道:
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运行是不安全的。
谢谢!
答案 0 :(得分:2)
这是OpenCL 1.2规范对使用CL_MEM_USE_HOST_PTR
创建的缓冲区所说的内容:
如果指定,则表示应用程序希望OpenCL实现使用host_ptr引用的内存作为内存对象的存储位。
这意味着从主机和设备同时访问此缓冲区是不安全的(除非两者都只是读取)。如果您希望主机和设备分配不同,只需创建缓冲区,而不用 CL_MEM_USE_HOST_PTR
标志。