は、私がrows
とcols
と呼ば__m256i
2つの変数を持っていること、例えば、のは言わせて、その中の値は、次のとおりです。効率的に配列にアクセスするために__m256i` `からの値を使用して - SIMD
rows: 0, 2, 7, 5, 7, 2, 3, 0
cols: 1, 2, 7, 5, 7, 2, 2, 6
、これらの値8点のためx
とy
位置を表すので、この場合には、私はこれらの点を有するであろう:
p0: [0, 1], p1: [2, 2], p2: [7, 7], p3: [5, 5]
p4: [7, 7], p5: [2, 2], p6: [3, 2], p7: [0, 6]
Iはまた、アレイはlut
と呼ばたの値を有することタイプ:
lut: [0, 1, 2, 3, ..., 60, 61, 62, 63]
私が何をしたいのかは、rows
とcols
変数からこれらの位置値を使用することでlut
配列にアクセスし、lut
アクセス値を使用して新しい__m256i
値を作成することです。
私はそれを行う方法を知っている方法は、一度にlut
配列1から値を読み、新しい_m256i
値を作成するために_mm256_set_epi32()
を使用し、サイズ8の2つのint
配列にrows
とcols
値を格納することです。
これはうまくいきますが、非常に非効率的なようです。私の質問は、それをより速く行う方法があるかどうかです。
これらの値は単なるより具体的な例のためのものであることに注意してください、とlut
は、順序付けされた値またはサイズ64
感謝を持っている必要はありません!
ルックアップテーブルは、常に最新のプロセッサではあまり効率的ではありません。なぜなら、それらは常にデータ依存関係を作成するからです。ルックアップテーブルをある種の算術式で置き換える方法を見つけることができれば、それはより速くすることができます。それ以外の場合は、chtzの回答を参照してください。 –
あなたのコードを教えてください。あなたに最適化のヒントを与えることは可能かもしれません。 – xMRi
インデックスを4ビットのチャンクにスライスし、 'pshufb'でそれらを使って16要素のLUTを得ることができます。 (例えば、http://wm.ite.pl/articles/sse-popcount.htmlのようなSSE/AVXポップカウントの実装を見てください。)しかし、あなたのインデックスが「分離可能」でないときは、下位バイトで複数のシャッフルを行い、上位バイトでブレンドする必要があります。したがって、これはO(2 ^(n-4))です。 nビット= 4ビットである。 –