如何将数据从int4向量复制到int8向量?

时间:2019-09-17 23:56:24

标签: opencl

我正在尝试编写一个内核,其中参数之一是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个元素。

1 个答案:

答案 0 :(得分:0)

int4int8分别指包含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);

或者如果您想要vecAv中两个连续的元素,请使用

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