vectorization - Xeon Phi 上的 loaddup_pd/unpacklo_pd

标签 vectorization sse avx intel-mic xeon-phi

如果我在 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/

相关文章:

sse - 对于Intel Haswell上的XMM/YMM FP操作,可以使用FMA代替ADD吗?

c++ - SIMD:累积相邻对

windows - 是否有可能在 AVX/SSE 中获得多个正弦波?

python - Pandas /Numpy : Fastest way to create a ladder?

matlab - MATLAB 矢量化代码如何工作 "under the hood"?

c++ - 用于 float 阈值操作的 SIMD

.net - .NET Framework 4.5 是否提供 SSE4/AVX 支持?

c++ - AVX2是最有效的基于 mask 包装的方法吗?

gcc - Mac 上的 SSE4.1 内在函数编译错误

assembly - 查找 32 位整数中的最大值