使用CL_MEM_USE_HOST_PTR时是否需要将读/写排入队列
Is it necessary to enqueue read/write when using CL_MEM_USE_HOST_PTR?
假设我是wait()
,等待内核计算工作。
我想知道,当使用CL_MEM_USE_HOST_PTR标志分配缓冲区时,是否有必要在缓冲区上使用enqueueRead/Write,或者它们可以总是被省略?
注意
我知道参考号上的注释:
调用clEnqueueReadBuffer以读取缓冲区对象的区域ptr参数值设置为hostptr+偏移量,其中hostptr是当缓冲区对象读取是用CL_MEM_USE_HOST_TR创建的,必须满足以下条件避免未定义行为的要求:
- 在读取命令开始执行之前,使用此缓冲区对象的所有命令都已完成执行
- 缓冲区对象未映射
- 在读取命令完成执行之前,任何命令队列都不会使用缓冲区对象
因此,为了澄清我的问题,我将其一分为二:
- 如果我使用CL_MEM_USE_HOST_TR标志创建缓冲区,我是否可以假设OpenCL实现将在必要时写入设备缓存,这样我就可以总是避免
enqueueWriteBuffer()
- 如果我在启动内核后调用
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包含相当有用的描述。
相关文章:
- 我是否需要在下一次转移时将所有权*转移回转移队列
- 堆栈和队列是否像C++中的数组一样传递?
- Vulkan 的传输队列系列功能和显卡支持:条件检查是否准确?
- 是否可以使用简单队列创建优先级队列
- 是否有一种有效的方法来搜索队列中的关键字并覆盖其值
- 如何检查队列是否使用 STL 排序
- 如何检查提升消息队列是否存在
- 如何查看Tibco EMS独享队列是否有活跃消费者?
- 弹出后,C++队列是否会销毁对象?
- 是否可以更改在优先级队列中添加具有相同优先级的"side"对象?
- 是否使用示波器队列:: swap违反任何规则来清空std ::队列
- 可以检查提升::无锁::队列是否已满吗?
- 使用无锁指针队列在线程之间移动数据是否安全
- stl 优先级队列中的堆管理是否调用复制构造函数
- 在 C++11 中,lambda 队列是否是工作队列的良好设计模式
- 提升优先级队列,查看元素是否已在队列中
- Boost 的无锁队列是否有可能丢失元素?
- C++ 检查队列是否已满
- 事件队列是否与用于跨线程信号/槽(在Qt中)的队列相同?
- 具有独立读线程和写线程的单个队列是否需要锁定