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

Is it necessary to enqueue read/write when using CL_MEM_USE_HOST_PTR?

本文关键字:队列 是否 USE MEM CL HOST PTR 使用      更新时间:2023-10-16

假设我是wait(),等待内核计算工作。

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

注意

我知道参考号上的注释:

调用clEnqueueReadBuffer以读取缓冲区对象的区域ptr参数值设置为hostptr+偏移量,其中hostptr是当缓冲区对象读取是用CL_MEM_USE_HOST_TR创建的,必须满足以下条件避免未定义行为的要求:

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

因此,为了澄清我的问题,我将其一分为二:

  1. 如果我使用CL_MEM_USE_HOST_TR标志创建缓冲区,我是否可以假设OpenCL实现将在必要时写入设备缓存,这样我就可以总是避免enqueueWriteBuffer()
  2. 如果我在启动内核后调用event.wait(),我是否可以总是避免使用enqueueReadBuffer()访问用标志CL_MEM_USE_HOST_PTR创建的缓冲区上的计算数据

也许我想得太多了,但即使对标志的描述清楚地表明主机内存将用于存储数据,也不清楚(或者我没有找到它在哪里被清除)数据何时可用,以及读/写是否总是隐含的。

您永远不必使用enqueWriteBuffer(),但必须使用enqueMapBuffer。

请参阅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包含相当有用的描述。