Opencl 如何将数据从int4向量复制到int8向量?
我正在尝试编写一个内核,其中一个参数是int4类型的8元素向量。然后我尝试将向量读入本地内存,然后将数据从向量复制到int8向量。然后我想把int8向量存储到输出向量中 我试着为int8向量的每一半使用两个int4向量,但这似乎不起作用Opencl 如何将数据从int4向量复制到int8向量?,opencl,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;
__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个元素。
int4
和int8
分别指包含4或8个整数的OpenCL向量数据类型。在代码中,行
int8v=(int8)((int4)(vA.s0),(int4)(vA.s1));
(您忘记了右括号)包含表达式(int4)(vA.s0)
,它相当于(int4)(vA.s0,vA.s0,vA.s0,vA.s0,vA.s0)
,导致
int8v=(int8)(vA.s0,vA.s0,vA.s0,vA.s0,vA.s1,vA.s1,vA.s1,vA.s1,vA.s1);
你想要的是这样的东西
int8v=(int8)(vA.s0,vA.s1,vA.s2,vA.s3,vA.s0,vA.s1,vA.s2,vA.s3);
或者,如果您需要v
中的vecA
中的两个连续元素,请使用
int4va=vecA[2*id];
int4 vB=vecA[2*id+1];
int8v=(int8)(vA.s0,vA.s1,vA.s2,vA.s3,vB.s0,vB.s1,vB.s2,vB.s3);
此外,由于线程块中没有共享任何数据,因此无需将
vA
\uuuu设置为本地
。int4
不是C语言中的标准类型,因此它的含义和存储方式取决于您使用的编译器。它的文档应该描述它。此外,你有一个非C((大概是BUGGY)语法)。我在OpenCL中工作,C++的RabPaPiNT4只有四个元素,所以你不知道你在试图实现什么。在任何情况下,你都使用VA.S0,如果VA尝试使用It8V=(It8)(VA,VA),它就明确地访问第一个元素。