为什么OpenCL的洗牌示例无效?

为什么OpenCL的洗牌示例无效?,opencl,Opencl,有一个例子是在测试过程中OpenCL的shuffle 但我不明白为什么。我在Android中使用AndroidStudio对此进行了测试,结果显示:构建程序失败:BC src代码:9:9:{9:9-9:16}:错误:没有匹配的内置函数用于调用“shuffle”。然后,我将short更改为int,如下所示: uint8 mask; int16 a; int8 b; b = shuffle(a, mask); 没关系。我从文件中找不到任何理由,有人能帮我吗? 谢谢 我认为规范中描述的关键部分是:

有一个例子是在测试过程中OpenCL的
shuffle

但我不明白为什么。我在Android中使用AndroidStudio对此进行了测试,结果显示:构建程序失败:BC src代码:9:9:{9:9-9:16}:错误:没有匹配的内置函数用于调用“shuffle”。然后,我将short更改为int,如下所示:

uint8 mask;
int16 a;
int8 b;
b = shuffle(a, mask);
没关系。我从文件中找不到任何理由,有人能帮我吗?
谢谢

我认为规范中描述的关键部分是:

掩码中每个元素的大小必须与结果中每个元素的大小匹配

我认为这意味着,如果你想洗牌
short
s的向量,你的掩码必须是
ushort
的向量;
uint8
掩码仅对具有4字节元素的洗牌向量有效-换句话说,
int
uint
float

因此,以下内容应再次有效:

ushort8 mask; // <-- changed
short16 a;
short8 b;
b = shuffle(a, mask); // now valid

ushort8掩码;//谢谢,根据我的测试,我认为你是对的。但我无法理解这条规则的好处。另外,我发现掩码必须是无符号类型,在文档中没有提到<代码>ushort8掩码正常,并且
short8掩码将失败。可能,这与平台有关。掩码未签名的要求由它表示。我猜相同大小的组件类型规则可能是为了使用相同的SIMD寄存器?在任何情况下,一旦你知道了,就不难理解了。
ushort8 mask; // <-- changed
short16 a;
short8 b;
b = shuffle(a, mask); // now valid