在穿件image对象的时候,需要传入一个cl_image_format参数,该参数结果包含image_channel_order和image_channel_data_type两个成员。前一个成员表示的是image对象含有的内容及其顺序,如下表
这个很好理解,表示是的image对象的数据表示了哪些图像通道内容以及其顺序。
然后image_channel_data_type的可用值如下:
这个成员表示了两层含义:
- 后面部分表示每一个channel的数据在实际物理内存中是如何存储,比如INT8, SHORT_565, FLOAT等,可能更加实际一点的理解的话就是:如果把这个image对象的数据用在host上处理的话,应该按照什么样的数据类型来解读这些数据。
- 前面部分表示这些数据要以什么样的格式来在kernel中读写,比如UNORM则表示要以0~1.0范围的浮点来读写,对应read_imagef和write_imagef, SIGNED则表示要以对应的有符号整数范围来读写,对应read_imagei和write_imagei;HALF则表示以half float来读写,对应read_imagef和write_imagef。
例如:
- CL_UNORM_INT8:数据的实际物理存储为8位的int类型,但是在kernel中应该以read_imagef和write_imagef来进行读写操作,且值的范围为0~1.0(如果是SNORM则为-1.0~1.0). 而这之间的转换则由GPU中专用的硬件完成,效率相当高
- CL_SIGNED_INT16:数据的实际物理存储为16为的int,在kernel中以以read_imagei和write_imagei来进行读写操作.
参考: