9

私は Visual Studio 2008 で作業しており、プロジェクト設定に、None、SSE、または SSE2 に設定できる「拡張命令セットをアクティブにする」オプションが表示されます。

では、コンパイラは SIMD 命令を利用するために命令をまとめてバッチ処理しようとしますか?

コンパイラがこれらの拡張機能を使用して効率的なアセンブラを作成できるように、コードを最適化する方法について従うことができる規則はありますか?

たとえば、現在私はレイトレーサーに取り組んでいます。シェーダーは入力を受け取り、次のように入力から出力カラーを計算します。

PixelData data = RayTracer::gatherPixelData(pixel.x, pixel.y);
Color col = shadePixel(data);

たとえば、1 回の命令呼び出しで 4 つの異なるピクセルをシェーディングするようにシェーダーコードを記述すると有益でしょうか? このようなもの:

PixelData data1 = RayTracer::gatherPixelData(pixel1.x, pixel1.y);
...
shadePixels(data1, data2, data3, data4, &col1out, &col2out, &col3out, &col4out);

一度に複数のデータユニットを処理します。これは、コンパイラに SSE 命令を使用させるのに役立ちますか?

ありがとう!

4

3 に答える 3

5

私は Visual Studio 2008 で作業しており、プロジェクト設定に、None、SSE、または SSE2 に設定できる「拡張命令セットをアクティブにする」オプションが表示されます。

では、コンパイラは SIMD 命令を利用するために命令をまとめてバッチ処理しようとしますか?

いいえ、コンパイラは単独でベクトル命令を使用しません。x87 命令の代わりにスカラー SSE 命令を使用します。

あなたが説明するものは「自動ベクトル化」と呼ばれます。Microsoft コンパイラはこれを行いませんが、Intel コンパイラは行います。

Microsoft コンパイラでは、組み込み関数を使用して手動で SSE 最適化を実行できます。

于 2010-10-26T18:40:28.063 に答える
3

3つの観察。

  1. 最高のスピードアップは、最適化からではなく、優れたアルゴリズムからもたらされます。したがって、最初にその部分を正しく理解してください。多くの場合、これは特定のドメインに適したライブラリを使用することを意味します。

  2. アルゴリズムを正しく理解したら、次はMeasureです。多くの場合、80/20 ルールが機能しています。コードの 20% が実行時間の 80% を占めます。しかし、その部分を見つけるには、優れたプロファイラーが必要です。インテル VTuneは、すべての関数からのサンプリング プロファイルと、パフォーマンス キラーを特定する優れたレポートを提供します。AMD CPU を使用している場合は、AMD CodeAnalystも無料で利用できます。

  3. コンパイラーの自動ベクトル化機能は特効薬ではありません。非常に苦労しますが (特にIntel C++ )、ベクトル形式でアルゴリズムを書き直す必要がある場合がよくあります。多くの場合、ボトルネック コードの小さな部分を手作りして SIMD 命令を使用することで、より良い結果を得ることができます。組み込み関数を使用するか、インライン アセンブリを使用して、C コード (上記の VJo のリンクを参照) でそれを行うことができます。

もちろん、パート 2 と 3 は反復プロセスを形成します。これについて真剣に考えている場合は、The Software Optimization Cookbookやプロセッサのリファレンス マニュアルなど、Intel 関係者による優れた書籍がいくつかあります。

于 2010-10-26T20:59:14.343 に答える
0

コンパイラは万能ではなく、いくつかの制限があります。可能な場合 (そして正しいフラグが渡された場合)、SSE 命令を使用します。何が行われたかを確認する唯一の方法は、コンパイラによって生成されたアセンブリ コードを調べることです。

もう 1 つのオプションは、C SSE/SSE2 命令を使用することです。Windows の場合は、次の場所にあります。

http://msdn.microsoft.com/en-us/library/y0dh78ez%28VS.80%29.aspx

于 2010-10-26T18:36:39.343 に答える