假设我wait()
让内核计算工作。
我想知道,在使用CL_MEM_USE_HOST_PTR标志分配缓冲区时,是否需要在缓冲区上使用enqueueRead / Write,或者总是是否可以省略?
注意
我在参考文献中注意到这个说明:
调用clEnqueueReadBuffer以读取缓冲区对象的区域 ptr参数值设置为host_ptr + offset,其中host_ptr是a 指向缓冲区对象所指定的内存区域的指针 使用CL_MEM_USE_HOST_PTR创建读取,必须满足以下条件 要求以避免未定义的行为:
- 使用此缓冲区对象的所有命令在读取命令开始执行之前已完成执行
- 未映射缓冲区对象
- 在读取命令执行完毕之前,任何命令队列都不使用缓冲区对象
醇>
所以,为了澄清我的问题,我把它分成两部分:
enqueueWriteBuffer()
?event.wait()
,我是否总是避免enqueueReadBuffer()
访问使用标志CL_MEM_USE_HOST_PTR创建的缓冲区上的计算数据?也许我正在思考它,但即使标志的描述清楚地表明主机存储器将用于存储数据的事实,也不清楚(或者我没有找到它被清除的地方)关于数据何时可用以及读/写总是隐式的。
答案 0 :(得分:2)
你永远不必使用enqueueWriteBuffer(),但你必须使用enqueueMapBuffer。
请参阅http://www.khronos.org/registry/cl/specs/opencl-1.2.pdf第89页(1.1中也是如此)。
只有在映射对象后数据才可用,并且在取消映射对象后将再次变为未定义。此旧帖子http://www.khronos.org/message_boards/showthread.php/6912-Clarify-CL_MEM_USE_HOST_PTR包含相当有用的描述。