我正在尝试使用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
到底是做什么的?我在网上可以找到的所有内容都与此相似:
随机掩码操作数为结果向量的每个元素指定结果元素获取两个输入向量中的哪个元素
但是它不能解释如何? AND, OR
正在进行吗?掩码中的数字是什么意思?
答案 0 :(得分:3)
mask
不是AND掩码;随机控制向量是将源向量串联在一起的索引向量。每个结果元素基本上都是res[i] = ab[ mask[i] ]
的结果。
SIMD随机播放是并行的表查找,其中控制向量(由于某种原因而简称为“掩码”)是索引的向量,而其他输入是表。
相关:Convert _mm_shuffle_epi32 to C expression for the permutation?显示具有编译时常数索引的_mm_shuffle_epi32
(pshufd)的普通C等效项。您有一个2输入随机播放,可以按顺序索引到a和b的串联中。
AVX1 / AVX2没有真正对运行时变量输入执行此操作的混洗,因此__builtin_shuffle
必须编译为多个指令。
AVX512F vpermt2d
正是这种方式。