因此,通过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等函数吗?
答案 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