1
256レジスタのすべての32ビット要素を合計したいのですが、イントリンシック命令はありません。だから私はこのようないくつかのことを合計しましたが、このメソッドはコンパイル時に多くのアセンブリ命令を生成します。AVXを使用してベクトル要素を合計するにはどうすればよいですか?
私の方法:
_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
[AVX命令で水平方向のベクトル和を実行する最速の方法](http://stackoverflow.com/questions/9775538/fastest-way-to-do-horizontal-vector-sum-with-avx-instructions) ) –
[8パック32ビット浮動小数点の水平和](http://stackoverflow.com/q/13879609/995714)、[水平方向に__m256を合計する方法](http://stackoverflow.com/q/13219146/995714) 、[256ビットAVXベクトルでの32ビット浮動小数点の水平方向の合計](http://stackoverflow.com/q/23189488/995714) –
私はそれらを読んで試しましたが、スピードアップは変更されませんでした – ADMS