1.加载和保存同类型的数据:如果发送端和接收端的数据类型相同,例如将一个区域的int4型向量加载到另一区域中,只知道“=”即可。除了对变量赋值外,等号还可以将一个区域的数据赋值传输到另一个区域中。例如,内核想将全局内存中的数据加载到局部内存中,并将处理完的结果保存回全局内存。如果要将局部内存改为私有内存,只需要将数据声明中的_local标识符去掉即可,默认的标识符便是_private,因此,如果没有标识符,编译器会将变量自动保存在私有内存中。
2.将标量数组加载保存到向量中:大多数情况下,可能需要用向量来处理数据,但数据输入却一般都保存在标量数组中。这时,“=”就不管用了,你不可以将一个地址空间中的数据类型转换到另外一个地址空间中。所以OpenCL提供了函数vloadn,用来将标量数据加载保存到向量中:
vector vloadn(size_t offset, const __(g|c|l|p) scalar *mem);
n表示的是向量所包含的向量分数量,它必须被设定为2,3,4,8或16.vector可以是任意一种向量类型,而scalar则必须和vector中的分量类型一致。vector数据所在的内存地址可以和scalar数据所在的地址不同。例如,假设float_vec是一个float4型向量,而float_array是一个float型数组。下面代码的功能就是将float_array数组中的四个float型数据保存到float_vec向量中:
float_vec = vload4(0,float_array);
参数offset决定了哪些数组元素将被放到向量之中。这个参数和向量的大小(而不是它的标量分量的大小)有关。
3.将向量保存到标量数组中:和函数vloadn将标量数组保存到向量类似,函数vstoren做的是反向操作,将向量中的数据保存到标量数组中:
void vstoren(vector vec, size_t offset, __(g|l|p) scalar *mem);
这个函数将向量vec中的数据保存到mem指向的标量数组保存到offset确定的地址空间中。和函数vloadn一样,n必须等于向量vec中的分数量,其值必须设定为2,3,4,8或16.但是和函数vload不同,标量数组不能保存到一个常数地址空间之中,下面代码将int4型向量int_vec保存到指针int_array所指向的整形数组中;
vstore4(int_vec, 0, int_array);
通过修改offset参数,可以将向量保存到数组中的不同位置,位置差为(向量大小*offset)。通过指针运算,可以将向量保存在数组中非对齐的内存位置。
OPenCL标准还分别提供了函数vload_halfn将半精度数据保存到浮点型向量中,以及vstore_halfn将浮点型向量中的数据保存到半精度数组中。