0

Direct3D 11 の上に高性能の UI レイアウト エンジンを構築しています。このアプリケーションは、x64 をターゲットとする Visual Studio 2013 を使用して開発されており、Windows 7 (プラットフォーム アップデートあり) 以降を対象としています。

XMMATRIXビジュアル ツリーの 2D 要素に対して行列変換を行う必要があり、DirextXMath の組み込み (SIMD 最適化)とその関連関数を使用することが 2D の使用に効率的かどうか疑問に思っています ( XMMATRIXet al が 4x4 であるのに 3x3 行列のみが必要なため)。 )、または独自の行列クラス/関数をロールする必要があるかどうか(おそらくSIMD固有のコードはありません)。

全体を通して 4x4 行列は多くの冗長な計算が実行されることを意味するように思えますが、非 SIMD 3x3 行列の作業と比較すると、SIMD 命令によって相殺される可能性があります。


編集:「時期尚早の最適化はすべての悪の根源である」(およびその派生物)についてのコメントは、ここでは不要です(皮肉なことに時期尚早です。プロジェクトまたは私について何も知らないからです)。質問は、私がいくつかの視点に興味を持っていること、または詳細を知っていることを要約しています。

4

1 に答える 1

1

レイアウト エンジンは多くの連鎖変換を行う傾向があるため、SSE レジスタ内のデータを使用する (および連鎖の間保持する) と、パフォーマンスが向上する可能性があります (通常、連鎖変換がほんの一握りしかない典型的なゲーム シナリオよりもさらに改善されます)。 )。カスタム クラスで特に SSE を使用しない場合は、XMMATRIXおそらく高速になります。各行は SSE レジスタに収まるので、列の違いはそれほど重要ではありませんが、行の違いは余分な負荷を意味します。それでも、SSE の利点はおそらくそれだけの価値があります。

とは言うものの、最近のコンパイラの多くは現在自動ベクトル化を行っているため、バニラ C++ で記述したカスタム クラスは、いずれにせよ舞台裏で SSE に最適化される可能性があります。

いずれにせよ、キャッシング動作のためにエンジンをまだ最適化していなければ、パフォーマンスに違いは見られないでしょう。たとえば、エンジンがポインターを使用して階層を表し、必要なときにヒープに新しい要素を割り当てるだけの場合、キャッシュをスラッシングし、SSE であろうとなかろうとメモリを待つ間、変換を計算する十分な時間を確保できます。

于 2014-10-01T16:32:10.163 に答える