c - 了解 SIMD 随机播放控制掩码

标签 c simd avx

我正在尝试使用 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 掩码;洗牌控制 vector 是源 vector 串联的索引 vector 。每个结果元素基本上都是 res[i] = ab[mask[i] ] 的结果。

SIMD 洗牌是并行表查找,其中控制 vector (出于某种原因简称为“掩码”)是索引 vector ,其他输入是表。

相关:Convert _mm_shuffle_epi32 to C expression for the permutation?显示具有编译时常量索引的 _mm_shuffle_epi32 (pshufd) 的普通 C 等价物。您有一个 2 输入洗牌,索引到 a 和 b 的串联(按该顺序)。

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

AVX512F vpermt2d不过,正是这样工作的。

关于c - 了解 SIMD 随机播放控制掩码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57032331/

相关文章:

c - C 语言的 OSGi 实现?

x86 - _mm_cmpistri 的模式 12

c - 包含一个 Makefile,就好像我在另一个目录中一样?

c++ - 无法使 rustc 使用 simd 指令进行包含范围循环

x86 - 对齐与未对齐 x86 SIMD 指令之间的选择

c++ - C/C++ : emulating restrict keyword by copying arguments to local variables

gcc - clang 是否有相当于 GCC 的 -mno-vzeroupper 标志?

c - 带有 SIMD 的 vector 的点积

c - 为什么要在函数头中声明 C 数组参数的大小?

c - 这个 for 循环中发生了什么