存储器对象是OpenCL中一个很基本的概念。存储器对象的分配对应于一个上下文,这个上下文中可能有一个或多个设备。存储器对象对上下文中所有的设备都是可见的。存储器对象不能在不同平台设备间共享数据。为了避免存储器对象在设备上的重复分配(例如,可能在某个设备上根本就不会使用该存储器对象),只会在设备端第一次使用时才会分配存储器对象,所以创建后第一次使用存储器对象时会比较慢。
OpenCL定义了一个宽松的内存模型,也就是说对一个存储器对象的所有写操作并非对同一缓冲区的后续读操作都可见,对于这种情况需要一个栅栏(barrier)或明确的同步点。
OpenCL中用cl_mem数据类型来表示存储器对象引用。缓冲区(Buffer)、图像和管道是存储器对象实体。如果存储器对象包含了像素数据,可以创建图像对象;而针对其他情况可以把数据存放在缓冲区或管道中。
除了可以创建存储器对象实现主机与设备间共享数据,在OpenCL 2.0中也可以创建主机与设备共享的虚拟存储器。对于共享虚拟存储器中的数据,主机与设备都可以直接操作,极大地方便了程序开发。
本专题我们就主要讲解OpenCL 2.0中的存储器对象和共享虚拟存储器。