1

正確な用語集がわからないことをお許しください。

実装したいのは、キューのような SIMD コンテナーです。

SIMD を使用してパックド レイ マーチングを行うと想像してください。つまり、一度に距離フィールドを進行する 4 つのレイがあります。2 つのレイが最初にオブジェクトに衝突する可能性があります。次に、現在の SIMD レジスタからそれらを抽出し、レジスタに別の 2 つのレイ ID を取得します。

SIMD のシャッフル操作はこの方法では機能しないため、1 つの Ray ID を残りの 3-Ray-ID-tuple レジスタと組み合わせるのは非常に困難です。

いくつかのビット シフト/ビット マスキング操作を利用することは解決策ですが、この問題に対する別のエレガントなアプローチがあるかどうかを知りたいです。

4

2 に答える 2

2

これは SIMD の実際の動作とは異なります。申し訳ありません。

4 つの同一の計算を並行して問題なく実行できます。

ただし、レイマーチングで高さフィールドをサンプリングすることには、すでに少し問題があります。4 つの異なる光線は、非常に不自然な特殊なケース (正確に 1 テクセル オフセットで間隔をあけ、uまたはvに平行な平行光線) でない限り、一度に異なるサンプルを必要とします。つまり、収集操作が必要です。

現在のほとんどのアーキテクチャ (指定していません) は、高さマップから 4 つの任意の場所を 1 つの SIMD レジスタに読み込むなど、スキャッター/ギャザーをサポートしていません。もちろんできますが、4回の読み取りと4回のシャッフルになり、SIMDをすべてスキップするよりも遅くなります。

また、任意の時点で任意のデータを簡単にスワップ インおよびスワップ アウトし、SIMD レジスタの半分で別のコード (計算の最初の部分) を実行しながら、残りの半分で別のコードを続行することもできません。SIMD はそのようには機能しません
SIMD 操作では、すべてのデータが同じ命令を同時に実行します (または、命令は 1 回だけ実行されますが、「複数のデータ」に対して実行されます)。また、SIMD と分岐は一種の「ダメ」です。分岐は非効率であるだけでなく、必要なデータだけでなく、すべてのデータに影響を与えます。
どちらかといえば、SIMD で条件付き移動を使用するか、ロット全体で計算を続行するだけです。

于 2012-08-28T11:38:41.720 に答える
0

低要素または高要素のみをロードする他の SSE コマンドを検討しましたか?

movss: copy a single floating-point data
movlps: copy 2 floating-point data (low packed)
movhps: copy 2 floating-point data (high packed)
movaps: copy aligned 4 floating-point data (fast)
movups: copy unaligned 4 floating-point data (slow)
movhlps: copy 2 high elements to low position
movlhps: copy 2 low elements to high position

http://www.songho.ca/misc/sse/sse.html

または、SHUFPS を使用したい場合は、Windows .exe ツールをエクスポートして、あらゆるシャッフルの可能性を理解するのに役立てることができます。

また、AVX SIMDを調べてください。最新の Intel および AMD CPU でのみ使用できますが、8 つの 32 ビット float データ要素を一度に処理できます。

于 2012-08-29T01:28:22.993 に答える