了解opencl的GPGPU同仁们都必须关注的问题之一就是内存。OCL使用ocl memory object 来存储各种输入或输出数据。ocl memory object 是global memory/constant memory的存储实体。
ocl memory object可以分为两大类:buffer和image。
如OCL spec 中所说,buffer具有以下特点:
(1).可视为随机访问的线性数组(可读可写),与数组的访问方式相同(Array[idx] = **)
(2).可以存储用户自定义的数据结构(自然也支持OCL内建数据类型)
(3).在kernel中需要提供buffer的字节参数来确定其大小
image是一个模式化定制的数据容器,是支持矩阵运算和图像操作的利器。它的结构也与名称一致,具有图像数据的通道个数,通道类型等特征。image具有以下特点:
(1).内存布局对用户透明(底层实现的硬件相关性大),需要使用内建函数进行读写(read_image, write_image等)
(2).支持的数据类型有限(通道数目+通道的数据类型(单个像素字节数)均有限),不支持自定义的结构体。
(3).不支持既读又写