OpenCL学习笔记(21)--图像对象和采样器

   内存对象可以用来对主机和设备之间所要传输的数据进行包装。内存对象可以分为两种类型:缓存对象和图像对象。缓存对象用来传输通用数据。理论上讲:可以将图像对象保存在缓存对象中,将它的像素作为一般的缓存数据来访问。但选择图像对象有如下四个重要的理由:

(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 = CL_RGBA;
format.image_channel_data_type = CL_UNSIGNED_INT8;
image = clCreateImage2D(context,CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR,&format, width, height, 0, (void*)data,&err);
在创建完一个图像对象后之后,就可以将它作为内核函数的参数发送到设备上。操作过程和缓存对象一样。如果将cl_mem对象设为参数,调用clSetKernel函数,这个内核函数便可以将图像对象作为正常的参数来访问。例如,下面几行代码就将前面的图像对象声明为image_knl内核的一个参数:
clSetKernelArg(image_knl,0, sizeof(cl_mem),&image);
当不再需要图像对象之后,就会调用clReleaseMenObject函数来释放他的内存。图像对象是通过调用clReleaseMemObject(image)的方式来释放。

(3)主机上的采样器:cl_sampler:
在内核读取图像数据之前,它需要知道某些信息,例如坐标格式以及如何解释图像大小之外的坐标。它还需要知道应该如何对像素点之间的颜色进行插值处理。所有这些信息都是保存在一个名为采样器(sampler)的数据结构中。
采样器可以通过主机程序来创建,也可以在内核中创建。主机应用程序通过调用clCreateSampler函数,来创建cl_sampler对象,clCreateSampler的函数:
cl_sampler clCreateSampler(cl_context context,cl_bool normalized_coords,cl_addressing_mode addressing_mode, c_filter_mode filter_mode, cl_int*errcode_ret)
(1)normalized_cords–指明坐标是否要归一化(取值范围0.0~1.0);
(2)addressing_mode–指明内核对超出图像大小范围的坐标的处理方式;
(3)filter_mode–指明内核对像素之间颜色取值的插值处理方式。
如果在配置采样器时,属性设置出现错误,内核就会从图像中读入错误的颜色数据.

发布了20 篇原创文章 · 获赞 21 · 访问量 638

猜你喜欢

转载自blog.csdn.net/INFINALGEORGE/article/details/105221725