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

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;

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

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),它就明确地访问第一个元素。