我正在尝试编写一个内核,其中参数之一是int4类型的8元素向量。然后,我试图将向量读取到本地内存中,然后将数据从向量复制到int8向量中。然后我想将int8向量存储到输出向量中。
我试图对int8向量的每一半使用两个int4向量,但这似乎不起作用。
__kernel void vecload(__global int4* vecA,
__global int* vecR) {
int id = get_local_id(0);
__local int4 vA;
vA = vecA[id];
int8 v = (int8)((int4)(vA.s0),(int4)(vA.s1);
vstore8(v, 0, vecR);
}
输出显示vecA的第一个元素四次,然后显示四次。它应该显示矢量的所有8个元素。
答案 0 :(得分:0)
int4
和int8
分别指包含4或8个整数的OpenCL矢量数据类型。在您的代码中,该行
int8 v = (int8)((int4)(vA.s0),(int4)(vA.s1));
(您忘记了右括号)包含与(int4)(vA.s0)
等效的表达式(int4)(vA.s0, vA.s0, vA.s0, vA.s0)
,导致
int8 v = (int8)(vA.s0, vA.s0, vA.s0, vA.s0, vA.s1, vA.s1, vA.s1, vA.s1);
您想要的是这样的
int8 v = (int8)(vA.s0, vA.s1, vA.s2, vA.s3, vA.s0, vA.s1, vA.s2, vA.s3);
或者如果您想要vecA
中v
中两个连续的元素,请使用
int4 vA = vecA[2*id ];
int4 vB = vecA[2*id+1];
int8 v = (int8)(vA.s0, vA.s1, vA.s2, vA.s3, vB.s0, vB.s1, vB.s2, vB.s3);
由于您不在线程块内共享任何数据,因此也无需创建vA
__local
。