使用CL_MEM_USE_HOST_PTR时是否需要将读/写入队?

时间:2013-12-13 12:18:42

标签: c++ c opencl

假设我wait()让内核计算工作。

我想知道,在使用CL_MEM_USE_HOST_PTR标志分配缓冲区时,是否需要在缓冲区上使用enqueueRead / Write,或者总是是否可以省略?

注意

我在参考文献中注意到这个说明:

  

调用clEnqueueReadBuffer以读取缓冲区对象的区域   ptr参数值设置为host_ptr + offset,其中host_ptr是a   指向缓冲区对象所指定的内存区域的指针   使用CL_MEM_USE_HOST_PTR创建读取,必须满足以下条件   要求以避免未定义的行为:

     
      
  1. 使用此缓冲区对象的所有命令在读取命令开始执行之前已完成执行
  2.   
  3. 未映射缓冲区对象
  4.   
  5. 在读取命令执行完毕之前,任何命令队列都不使用缓冲区对象
  6.   

所以,为了澄清我的问题,我把它分成两部分:

  1. 如果我使用CL_MEM_USE_HOST_PTR标志创建缓冲区,我是否可以假设OpenCL实现会在必要时写入设备缓存,因此我总是避免enqueueWriteBuffer()
  2. 如果我在启动内核后调用event.wait(),我是否总是避免enqueueReadBuffer()访问使用标志CL_MEM_USE_HOST_PTR创建的缓冲区上的计算数据?
  3. 也许我正在思考它,但即使标志的描述清楚地表明主机存储器将用于存储数据的事实,也不清楚(或者我没有找到它被清除的地方)关于数据何时可用以及读/写总是隐式的。

1 个答案:

答案 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包含相当有用的描述。