我正在尝试编写一个内核,其中一个参数是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个元素。
发布于 2019-09-20 15:36:02
int4
和int8
分别指包含4或8个整数的OpenCL矢量数据类型。在您的代码中,代码行
int8 v = (int8)((int4)(vA.s0),(int4)(vA.s1));
(您忘记了右括号)包含等价于(int4)(vA.s0, vA.s0, vA.s0, vA.s0)
的表达式(int4)(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
。
https://stackoverflow.com/questions/57983321
复制相似问题