【问题标题】:Reverse a AVX register containing doubles using a single AVX intrinsic使用单个 AVX 内在函数反转包含双精度的 AVX 寄存器
【发布时间】:2012-11-05 13:00:18
【问题描述】:

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

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

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

我可以使用_mm256_permute2f128_pd() 来执行此操作吗?我认为您不能使用上述内在函数来解决每个单独的双重问题。

【问题讨论】:

    标签: c sse vectorization simd avx


    【解决方案1】:

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

    • _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
    

    【讨论】:

    • 是的。值得记住的是,AVX2 将添加一个完整的置换,即使你今天不能使用它,VPERMPD / _mm256_permute4x64_pd。英特尔的参考文档有更多详细信息。
    • 知道两条指令的延迟比较吗?
    • 我的意思是“_mm_shuffle_ps()”反转 SSE 寄存器的延迟以及上述对 AVX 寄存器的反转操作
    • @user1715122 我不知道。您可能可以从 Agner Fog's tables 中添加它。当然,由于其他因素,实际表现会更加复杂。
    【解决方案2】:

    AVX2新增了对粒度更细的 128 位的车道交叉洗牌的支持:

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

    VPERMPD ymm1, ymm2/m256, imm8 在 Intel CPU 上运行的吞吐量和延迟与其他通道交叉随机播放(如 VPERM2F128)相同。还有in the intrinsics finder

    在 AMD Zen1(和 Excavator)上,vpermpd 比 2-input vperm2f128 更快。它们的向量 ALU 内部只有 128 位宽; 256 位向量指令被解码为至少 2 个微指令,但车道交叉操作需要更多,尤其是可以读取 4 个总车道中的任何一个的操作。 (不幸的是,解码器在为 vperm2f128 选择 uops 时不仅仅查看直接位)。手动 vextractf128 / vinsertf128 在 Bulldozer-family 和 Zen1 上会比 vperm2f128 好,但在其他地方会很糟糕。 https://uops.info/。我认为vpermpd 在 Excavator / Zen1 上是最佳选择,3 uops 与至少 4 到车道内倒车,然后与 vextracti128 / vinsert128 交换一半。


    有一些 CPU 带有 FMA3 但没有 AVX2,例如AMD 打桩机和压路机。在 Intel 上,AVX2 和 FMA 都是 Haswell 的新功能。 AMD Bulldozer 系列已过时,但仍在家用计算机中,因此即使您的功能利用 AVX1 + FMA,您的选择也是需要 AVX2 并让这少数 CPU 退回到更糟糕的东西(例如,没有 FMA 的 AVX1) ,或者制作另一个版本的函数。

    【讨论】:

      猜你喜欢
      • 2023-04-08
      • 2016-11-22
      • 1970-01-01
      • 2015-08-31
      • 2017-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-25
      相关资源
      最近更新 更多