OpenCL 1.2 Mem Object标志

时间:2014-08-04 18:01:12

标签: memory opencl

因此,通过OpenCL 1.2参考页面,我注意到了clCreateBuffer的不同。

有三个新的cl_mem_flags可用于主机使用:CL_MEM_HOST_READ_ONLY,CL_MEM_HOST_WRITE_ONLY和CL_MEM_HOST_NO_ACCESS。我有点困惑这些与早期版本的cl_mem_flags有何不同? CL_MEM_READ_ONLY和CL_MEM_WRITE_ONLY不会完成同样的事情吗?

另外,这些标志会影响你如何调用clEnqueueRead / Write / Map / UnmapBuffer等函数吗?

1 个答案:

答案 0 :(得分:0)

这些新标志基本上是原始标志的“主机对应物”。

例如,考虑CL_MEM_READ_ONLY标志:

  

此标志指定在内核中使用时,内存对象是只读内存对象

与此相反,对于CL_MEM_HOST_READ_ONLY

  

此标志指定主机仅读取内存对象

(来自clCreateBuffer documentation,我强调)

因此,它们允许更精细地说明您将对内存执行的操作:

Host read, Kernel write
Host write, Kernel write
Host read+write, Kernel read
....

这使得OpenCL实现能够在引导下进行优化,引用上述文档:

  

此标志指定主机仅写入内存对象(使用将写入或映射排入队列的OpenCL API)。这可用于优化来自主机的写访问(例如,对通过诸如PCIe的系统总线与主机通信的设备的存储器对象启用写组合分配)。


当然这会影响缓冲区的使用方式。例如,当您使用CL_MEM_HOST_READ_ONLY创建主机只读缓冲区时,尝试使用clEnqueueWriteBuffer写入此缓冲区将失败 - 再次引用documentation

  

<强>错误

     如果功能成功执行,

clEnqueueWriteBuffer 会返回CL_SUCCESS。否则,它将返回以下错误之一:

     

...

     

CL_INVALID_OPERATION如果在使用clEnqueueWriteBuffer

创建的缓冲区上调用CL_MEM_HOST_READ_ONLY