2016-04-12 12 views
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

+3

[AVX命令で水平方向のベクトル和を実行する最速の方法](http://stackoverflow.com/questions/9775538/fastest-way-to-do-horizo​​ntal-vector-sum-with-avx-instructions) ) –

+1

[8パック32ビット浮動小数点の水平和](http://stackoverflow.com/q/13879609/995714)、[水平方向に__m256を合計する方法](http://stackoverflow.com/q/13219146/995714) 、[256ビットAVXベクトルでの32ビット浮動小数点の水平方向の合計](http://stackoverflow.com/q/23189488/995714) –

+1

私はそれらを読んで試しましたが、スピードアップは変更されませんでした – ADMS

答えて

0
あなたは、任意の最適化コンパイラはベクトル化蓄積の有無にかかわらず合計の削減()、cilkplusの減速のために生成するコードで開始される可能性があります

かomp simd reduction。間違いなく128ビットのサブレジスタを追加するステップがあり、1つはhaddなどである。

関連する問題