使用单个AVX内在函数反转包含双精度的AVX寄存器

时间:2012-11-16 18:59:56

标签: c sse vectorization simd avx

如果我有一个AVX寄存器,其中包含4个双打,并且我想将其反向存储在另一个寄存器中,是否可以使用单个内部命令执行此操作?

例如:如果我在SSE寄存器中有4个浮点数,我可以使用:

_mm_shuffle_ps(A,A,_MM_SHUFFLE(0,1,2,3));

我可以使用,_mm256_permute2f128_pd()吗?我不认为你可以使用上述内在函数解决每个人的双重问题。

2 个答案:

答案 0 :(得分:7)

你实际上需要2个permutes来做到这一点:

  • _mm256_permute2f128_pd()只能在128位块中进行置换。
  • _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

答案 1 :(得分:0)

使用AVX2:VPERMPD ymm1, ymm2/m256, imm8运行时的吞吐量和延迟与英特尔CPU上的其他通道混洗(如VPERM2F128)相同。 (在AMD挖掘机上,如果these numbers are rightvperm2f128比单vpermpd慢。)

FMA是AVX2的一个独立功能位,但实际上没有任何带有FMA3而不是AVX2的CPU。 (AMD Bulldozer系列有4操作数FMA4)。所以你仍然应该检查AVX2和FMA功能位,但是你不必担心你的功能在较少的CPU型号上可用。

因此,如果您的代码已经依赖于FMA或AVX2,那么请使用AVX2:

_mm256_permute4x64_pd(vec, _MM_SHUFFLE(0,1,2,3));  // i.e. 0b00011011

如果您还没有完全依赖FMA或AVX2,只需AVX,而且只是为了获得洗牌性能的一小部分而不值得制作另一个版本的功能,那么请使用Mysticial&#39;与SnB / IvB和AMD Bulldozer系列预挖掘机兼容的双指令解决方案。