了解 SIMD 随机播放控制掩码

Understanding the SIMD shuffle control mask

我正在尝试使用 C:

中的这个示例学习洗牌
typedef int v4si __attribute__ ((vector_size (16)));

v4si a = {1,2,3,4};
v4si b = {5,6,7,8};
v4si mask = {0,4,2,5};
v4si res = __builtin_shuffle (a, b, mask);    /* res is {1,5,3,6}  */

我不明白 mask 的具体作用是什么?我在网上能找到的都是类似这样的:

The shuffle mask operand specifies, for each element of the result vector, which element of the two input vectors the result element gets

但是没有解释怎么办? AND, OR 有什么活动吗?面具中的数字是什么意思?

mask 不是 AND 掩码; shuffle-control 向量是源向量串联的索引向量。每个结果元素基本上都是 res[i] = ab[ mask[i] ].

的结果

SIMD 随机播放是并行的 table-lookups,其中控制向量(由于某种原因简称为 "mask")是一个索引向量,其他输入是 table .

相关: 显示 _mm_shuffle_epi32 (pshufd) 与 compile-time-constant 索引的普通 C 等价物。你有一个 2-input shuffle,它索引到 a 和 b 的串联(按那个顺序)。

AVX1/AVX2 没有真正为 runtime-variable 输入执行此操作的随机播放,因此 __builtin_shuffle 必须编译为多条指令。

不过,

AVX512F vpermt2d 正是这样工作的。