【发布时间】: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 花费的时间更多
【问题讨论】:
-
我阅读并尝试了它们,但加速没有改变
-
@ADMS 如果引用问题的答案没有为您的代码提供种子,那么这可能不是您的瓶颈。为什么要优化非时间关键代码?
-
@ADMS:对我来说,93 倍的加速意味着如果您注释掉这部分,优化器只是删除了整个代码,因为其余代码可能没有语义上可见的副作用。
-
以
_mm256_extractf128_ps、_mm_add_ps两半一起开始,然后使用the existing methods for reducing a 128b vector。
标签: c x86 intrinsics avx