如果我在 512 宽 SIMD 向量中有以下 double ,如在 Xeon Phi 寄存器中:
m0 = |b4|a4|b3|a3|b2|a2|b1|a1|
有没有可能变成:
m0_d = |a4|a4|a3|a3|a2|a2|a1|a1|
使用一条指令? 另外,由于 double 没有按位内在函数,这仍然是实现上述目标的有效方法吗?
m0_t = _mm512_swizzle_pd(m9,_MM_SWIZ_REG_CDAB);//m0_t->|a4|b4|a3|b3|a2|b2|a1|b1|
__m512d res = _mm512_mask_or_epi64(m0,k1,zero,m0_t);//k1 is 0xAA
最佳答案
可以实现如下:
m0_d = _mm512_mask_swizzle_pd(m0,0xAA,m0,_MM_SWIZ_REG_CDAB);
看起来 swizzle 操作是有限的,但使用屏蔽变体我们也可以实现其他排列。
关于vectorization - Xeon Phi 上的 loaddup_pd/unpacklo_pd,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15353754/