« AVX2 の 集約 (GATHER) | メイン | 拡大縮小フィルタいろいろ »

2014年04月01日

x86 SIMD Technique:: 水平加算での合計計算

    

SSE3 であれば、以下のように2回水平加算を実行すると、全要素の合計値が全要素に入る。

sum = _mm_hadd_ps( sum, sum );
sum = _mm_hadd_ps( sum, sum );


では、AVX では 3回実行すれば合計値が求まるかと言うとそうはならない。
前後の入れ替えとインターリーブが間に必要になる。
128bit を超えて計算されない。

sum = _mm256_hadd_ps( sum, sum );
sum = _mm256_hadd_ps( sum, sum );
__m256 rsum = _mm256_permute2f128_ps(sum, sum, 0 << 4 | 1 );
sum = _mm256_unpacklo_ps( sum, rsum );
sum = _mm256_hadd_ps( sum, sum );


ちなみに SSE で合計計算しようとするとシャッフルを使って計算することになる。

__m128 tmp = sum;
sum = _mm_shuffle_ps( sum, tmp, _MM_SHUFFLE(1,0,3,2) );
sum = _mm_add_ps( sum, tmp );
tmp = sum;
sum = _mm_shuffle_ps( sum, tmp, _MM_SHUFFLE(2,3,0,1) );
sum = _mm_add_ps( sum, tmp );



投稿者 Takenori : 2014年04月01日 17:37




comments powered by Disqus
Total : Today : Yesterday : なかのひと