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



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

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);

或者,如果您希望在v中使用vecA两个连续的元素,请使用

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,因为您没有在线程块中共享任何数据。

最新更新