« Google Play デベロッパー プログラム ポリシー 新旧差分 | メイン | 水平加算での合計計算 »

2014年03月30日

x86 SIMD Technique:: AVX2 の 集約 (GATHER)

    

AVX2 に 集約 (GATHER) と言う命令が増えている。
これを使うとメモリ上で飛び飛びのデータを読める。

例えば画像データを縦方向に読みたい場合は、以下のようにすると縦1列で読める。

static const __declspec(align(32)) unsigned long M256_U32_OFFSET[8] = { 0, 1, 2, 3, 4, 5, 6, 7 };
__m256i offset = _mm256_load_si256( (__m256i const *)M256_U32_OFFSET );
offset = _mm256_mullo_epi32( offset, _mm256_set1_epi32(width) );
__m256i color8 = _mm256_i32gather_epi32( (const int*)src, offset, sizeof(int) );

_mm256_i32gather_epi32 の第3引数は定数値である必要があるみたいなので、そこでオフセットを調整することは出来ないようだ。
変数が指定出来れば、stride をここに指定出来てもう少し楽なんだけど。

このようにメモリ上で連続していなくてもデータを読めるので、かなり扱いやすくなった。
ただ、遅い。
メモリ上で連続していないから仕方ないと思うが……
やはり、従来通り出来るだけメモリ上で連続するようにして処理する方がいいのは変わらない。
一応 _mm_prefetch を使うことで少しは改善する。



投稿者 Takenori : 2014年03月30日 14:10




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