使用单个AVX内在函数反转包含双精度的AVX寄存器
如果我有一个AVX寄存器,其中有4个双打,并且我想将其反向存储在另一个寄存器中,是否可以使用单个内部命令执行此操作?
例如:如果我在SSE寄存器中有4个浮点数,我可以使用:
_mm_shuffle_ps(A,A,_MM_SHUFFLE(0,1,2,3));
我可以使用,也许是_mm256_permute2f128_pd()
吗? 我不认为你可以用上面的内在来解决每个人的双重问题。
你实际上需要2个permutes来做到这一点:
-
_mm256_permute2f128_pd()
仅以128位块的forms进行置换。 -
_mm256_permute_pd()
不会跨越128位边界进行置换。
所以你需要同时使用:
inline __m256d reverse(__m256d x){ x = _mm256_permute2f128_pd(x,x,1); x = _mm256_permute_pd(x,5); return x; }
测试:
int main(){ __m256d x = _mm256_set_pd(13,12,11,10); cout << x.m256d_f64[0] << " " << x.m256d_f64[1] << " " << x.m256d_f64[2] << " " << x.m256d_f64[3] << endl; x = reverse(x); cout << x.m256d_f64[0] << " " << x.m256d_f64[1] << " " << x.m256d_f64[2] << " " << x.m256d_f64[3] << endl; }
输出:
10 11 12 13 13 12 11 10
对于AVX2: VPERMPD ymm1, ymm2/m256, imm8
运行时的吞吐量和延迟与英特尔CPU上的其他通道VPERM2F128
(如VPERM2F128
)相同。 (在AMD挖掘机上,如果这些数字是正确的 ,则vperm2f128
比单个vpermpd
慢)。
FMA是AVX2的一个独立function位,但实际上没有任何带有FMA3而不是AVX2的CPU。 (AMD推土机系列有4操作数FMA4)。 因此,您仍应检查AVX2和FMAfunction位,但不必担心您的function在较少的CPU型号上可用。
因此,如果您的代码已经依赖于FMA或AVX2,那么使用AVX2:
_mm256_permute4x64_pd(vec, _MM_SHUFFLE(0,1,2,3)); // ie 0b00011011
如果您还没有依赖FMA或AVX2,只需要AVX,并且仅仅为了获得随机播放性能的小幅增益而不值得制作另一个版本的函数,那么使用Mysticial的双指令解决方案来兼容SnB / IvB,以及AMD Bulldozer系列预挖掘机。