【问题标题】:How to sum a vector elements using AVX? [duplicate]如何使用 AVX 对向量元素求和? [复制]
【发布时间】:2016-08-02 23:36:46
【问题描述】:

我想在一个 256 寄存器中对所有 32 位元素求和,但没有任何内在指令,或者如果有我无法帮助我想要什么。所以我做了一些这样的事情来总结,但是这个方法在编译时会产生很多汇编指令。

我的方法:

_mm256_store_ps(&temp4[0], sum0_i); 
            c_result[i][j]= temp4[0]+temp4[1]+temp4[2]+temp4[3]+temp4[4]+temp4[5]+temp4[6]+temp4[7];

汇编输出:

    vmovaps %ymm0, (%rsp)
    vmovss  (%rsp), %xmm0
    vaddss  4(%rsp), %xmm0, %xmm0
    vaddss  8(%rsp), %xmm0, %xmm0
    vaddss  12(%rsp), %xmm0, %xmm0
    vaddss  16(%rsp), %xmm0, %xmm0
    vaddss  20(%rsp), %xmm0, %xmm0
    vaddss  24(%rsp), %xmm0, %xmm0
    vaddss  28(%rsp), %xmm0, %xmm0
    vmovss  %xmm0, c_result(%r8,%rsi)

所以问题是如何更快、更专业地对所有元素求和并将它们存储到内存中的 32 位数组中?我试过hadd,但没有提高性能。因为我仍然有内存问题来保存它们,而且hadd 延迟和吞吐量比vaddss 花费的时间更多

【问题讨论】:

标签: c x86 intrinsics avx


【解决方案1】:

您可以从任何优化编译器生成的代码开始,用于使用或不使用 accumal()、cilkplus reducer 或 omp simd reduction 的向量化求和缩减。毫无疑问,有一个步骤是添加 128 位子寄存器,一个带有 hadd,等等。

【讨论】:

    猜你喜欢
    • 2018-11-30
    • 2021-08-21
    • 1970-01-01
    • 2013-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多