全局存储器中的数据内容通过存储器对象来表示。一个存储器对象就是对全局存储器区域的一个引用。在OpenCL中,存储器对象分为三种不同类型:
- 缓冲(buffer):内核可用的一个连续的存储器区域,编程人员可以将内建数据类型、矢量类型数据或用户自定义的数据结构(当然要符合OpenCL编程规范)映射到这个缓冲区,内核通过指针来访问缓冲区。
-
图像(image):图像对象用于存储基于标准格式的图像。图像对象是一个不透明的数据结构,使用OpenCL API函数来管理。通常不允许OpenCL内核对单个图像同时进行读和写。然而在OpenCL 2.0中,提供了同步和栅栏操作来放宽这个限制。
-
管道(pipe):管道存储器是数据项有序的队列。管道有两个端点:一个是写端点,用于插入数据项;另一个是读端点,数据项从读端点被移除。同一时刻,仅有一个内核实例可向一个管道写入数据,同时仅有一个内核实例可从一个管道读出数据。
大多数情况下,主机和OpenCL设备存储器模型是独立的。一旦分配存储器对象,对设备上的内核是有效的。不过在某些情况下,它们是需要交互的。在主机和设备间有三种交互方式:读/写/填充、映射和解映射以及拷贝。
要显式地读/写/填充数据,主机将命令入队,在主机和全局存储器之间传输数据。实现主机与OpenCL存储器对象间映射和解映射的方法允许主机将一个存储器区域映射到主机可以访问的地址空间。在主机程序安全操作存储器对象之前,主机将这个存储器对象入队到一个映射命令中;主机完成了对这个存储器区域的操作,则入队一个解映射命令,从而使得内核可以安全地读写缓冲。
拷贝命令是将存储器对象在两个缓冲间拷贝,这两个缓冲可驻留在主机或设备上。
上述三个操作命令可以是阻塞或非阻塞操作。