内存对象可以用来对主机和设备之间所要传输的数据进行包装。内存对象可以分为两种类型:缓存对象和图像对象。缓存对象用来传输通用数据。理论上讲:可以将图像对象保存在缓存对象中,将它的像素作为一般的缓存数据来访问。但选择图像对象有如下四个重要的理由:
(1)在GPU上,图像数据是保存在特殊的全局内存中,这个内存被称为纹理内存,和一般的全局内存不同,纹理内存是被缓存,用于高速访问处理。
(2)用来读写图像数据的函数可以在不卡吕图像数据格式的前提下,被调用,前提条件是数据格式要为OpenCL所支持。
(3)被称为采样器的特殊数据格式可以用来配置读取图像中呀白色信息的方式。
(4)OpenCL提供了这样的函数,用来返回和图像相关的信息,例如图像的大小,像素格式以及位深度。
为了在主机端检查设备是否支持图像处理,可以设置CL_DEVICE_IMAGE_SUPPORT选项,调用clGetDeviceInfo函数。如果返回值为CL_FALSE,表示设备并不支持图像处理。在内核中,如果设备能够支持图像数据的话,_IMAGE_SUPPORT_将会被设为1.如果不支持,这个宏将是未定义的。
(1)图像对象和采样器:图下对象用来保存主机应用程序和设备之间的像素数据。而在设备接受图像数据时,采样器会说明如何读取这些颜色取值。OpenCL会根据这些结构是在主机,还是在设备上的不同,而给予不同的名字。
如果是在主机上,图像对象就用cl_mem结构来表示,采样器就用cl_sampler结构来表示。而如果是在设备上,图像对象就是image2d_t或者image3d_t结构,而采样器就是sampler_t结构。
(2)主机上的图像对象:Cl_MEM:
所有的内存对象都用cl_mem数据类型来表示,没有其他的类型来区分缓存对象和图像对象。创建一个缓存对象,则需要调用clCreateBuffer函数或clCreateSubBuffer函数;而创建一个图像对象,则需要调用clCreateImage2d函数或clCreateImage3d函数。下面创建的是一个cl_image_format结构,然后用它来创建得到一个二维图像对象。图像中的每个像素点都是32位:红、蓝、绿以及alpha四个通道各占8位:
cl_image_format format;
format.image_channel_order