Memory OpenCL 1.2 Mem对象标志

Memory OpenCL 1.2 Mem对象标志,memory,opencl,Memory,Opencl,因此,通过阅读OpenCL1.2参考页,我注意到clCreateBuffer中存在差异 有三个新的cl_mem_标志与主机使用有关:cl_mem_host_READ_、cl_mem_host_WRITE_ONLY和cl_mem_host_NO_ACCESS。我只是有点困惑这些与早期版本的cl_mem_标志有什么不同?CL_MEM_READ_ONLY和CL_MEM_WRITE_难道不能完成同样的事情吗 此外,这些标志是否会影响调用函数(如clenqueuered/Write/Map/unambuf

因此,通过阅读OpenCL1.2参考页,我注意到clCreateBuffer中存在差异

有三个新的cl_mem_标志与主机使用有关:cl_mem_host_READ_、cl_mem_host_WRITE_ONLY和cl_mem_host_NO_ACCESS。我只是有点困惑这些与早期版本的cl_mem_标志有什么不同?CL_MEM_READ_ONLY和CL_MEM_WRITE_难道不能完成同样的事情吗


此外,这些标志是否会影响调用函数(如clenqueuered/Write/Map/unambuffer)的方式?

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

例如,考虑<代码> CyMyMyRead仅< <代码>标志:

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

与此相反,对于
CL\u MEM\u HOST\u READ\u

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

(由我强调)

因此,它们允许更细粒度地说明您将如何使用内存:

Host read, Kernel write
Host write, Kernel write
Host read+write, Kernel read
....
这使得OpenCL实现能够在引擎盖下执行优化,引用上述文档:

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


当然,这将影响缓冲区的使用方式。例如,当您使用
CL\u MEM\u host\u read\u
创建主机只读缓冲区时,尝试使用
clEnqueueWriteBuffer
写入此缓冲区将失败-再次参考:

错误

clEnqueueWriteBuffer
如果函数成功执行,则返回
CL\u SUCCESS
。否则,它将返回以下错误之一:

CL\u无效\u操作


谢谢你,这肯定会让区别更加明显