12

配列があるとします:

uint8_t arr[256];

そして要素

__m128i x

16 バイトを含む、

x_1, x_2, ... x_16

__m128i新しい要素を効率よく埋めたい

__m128i y

の値にarr応じて の値を使用しますx。次のようになります。

y_1  = arr[x_1]
y_2  = arr[x_2]
   .
   .
   .
y_16 = arr[x_16]

これを達成するためのコマンドは、基本的に、連続していないメモリ位置のセットからレジスタをロードすることです。そのようなコマンドのドキュメントを見たという痛ましいほど漠然とした記憶がありますが、今は見つかりません。それは存在しますか?よろしくお願いします。

4

1 に答える 1

7

SIMD アーキテクチャにおけるこの種の機能は、ロード/ストア スキャッター/ギャザーとして知られています。残念ながらSSEにはありません。Intel の将来の SIMD アーキテクチャには、これが含まれる可能性があります。失敗した Larrabee プロセッサは、その好例の 1 つです。現時点では、この種の機能が不要になるようにデータ構造を設計する必要があります。

_mm_set_epi8 などを使用して、同等の効果を実現できることに注意してください。

y = _mm_set_epi8(arr[x_16], arr[x_15], arr[x_14], ..., arr[x_1]);

もちろん、これは y ベクトルをロードするための一連のスカラー コードを生成するだけです。ループ前の初期化の一部など、パフォーマンスが重要なループの外でこの種の操作を行う場合、これは問題ありませんが、ループ内ではパフォーマンスが低下する可能性があります。

于 2010-12-19T18:10:24.543 に答える