【发布时间】:2016-03-11 09:37:55
【问题描述】:
我正在处理SSE 和一个新手。我正在尝试使用shuffle 指令来洗牌如下所示的 16 位向量:
输入:
1 2 3 4 5 6 7 8
输出:
1 5 2 6 3 7 4 8
如何实现预期目标?我对这里使用的常量感到困惑,我没有看到任何 16 位 shuffle 指令。 shuffle 指令仅适用于 8 位和 32 位。
【问题讨论】:
-
“我没有看到任何 16 位随机播放指令” 有
PSHUFHW/PSHUFLW,但我不认为他们可以做你正在尝试的事情在这里做。 -
您始终可以使用较小粒度的随机播放。但是,如果 shuffle 控件不是编译时常量,那么将单词索引向量转换为字节索引向量可能会很麻烦。 AVX512 通过提供具有字节、字、dword 和 qword 粒度的完整跨通道变量混洗来解决此问题。 (vpermb/vpermw/vpermd/vpermq。缺少内在函数指南
_mm512_permutexvar_epi16(nvm,它只是没有标记为“swizzle”))甚至还有 2 源变量控制洗牌,所以你可以有一个 512b向量从其他 2 个 512b 向量中挑选字节/单词/dwords/qwords! -
所以基本上编写必须洗牌的代码将会很棒......在可能的 10 年内,我们有时可以放弃为没有 AVX512 的 CPU 进行矢量化。