5

私は、200 行のコア モジュールによって 70% の時間が使用される、パフォーマンスが重要な、数を処理する C++ プロジェクトを書いています。

インライン アセンブリを使用してコアを最適化したいのですが、まったく初めてです。ただし、GCC や NASM で使用されるものなど、いくつかの x86 アセンブリ言語は知っています。

私が知っているすべて:

アセンブラ命令を配置し_asm{}たい場所に配置する必要があります。

問題:

  • どこから始めればよいかわかりません。インライン アセンブリが開始された時点で、どのレジスタに何が入っていますか?
4

6 に答える 6

13

名前で変数にアクセスし、それらをレジスタにコピーできます。MSDN の例を次に示します。

int power2( int num, int power )
{
   __asm
   {
      mov eax, num    ; Get first argument
      mov ecx, power  ; Get second argument
      shl eax, cl     ; EAX = EAX * ( 2 to the power of CL )
   }
   // Return with result in EAX
}

ASM ブロックで C または C++ を使用することも興味深いかもしれません。

于 2010-05-15T10:24:29.210 に答える
9

Microsoft コンパイラは、インライン アセンブリが含まれる場合の最適化が非常に苦手です。eax を使用すると、eax を別の空きレジスタに移動せず、eax を使用し続けるため、レジスタをバックアップする必要があります。GCC アセンブラは、この面ではるかに高度です。

このマイクロソフトを回避するために、組み込み関数の提供が開始されました。これらは、コンパイラがユーザーと連携できるため、最適化を行うためのはるかに優れた方法です。Chris が述べたように、インライン アセンブリは x64 では MS コンパイラでも機能しないため、そのプラットフォームでは、組み込み関数を使用するだけの方が本当に優れています。

それらは使いやすく、優れたパフォーマンスを発揮します。外部アセンブラを使用することで、さらに数サイクルを絞ることができることが多いことは認めますが、提供する生産性の向上には非常に適しています

于 2010-05-15T10:38:04.277 に答える
6

レジスターには何もありません。_asm ブロックが実行されます。レジスタに物を移動する必要があります。変数「a」がある場合、次のようにする必要があります。

__asm {
  mov eax, [a]
}

VS2010 には Microsoft のアセンブラーが付属していることに注意してください。プロジェクトを右クリックし、ビルド ルールに移動して、アセンブラー ビルド ルールをオンにすると、IDE が .asm ファイルを処理します。

VS2010 は 32 ビット プロジェクトと 64 ビット プロジェクトをサポートし、__asm キーワードは 64 ビット ビルドでは機能しないため、これはやや優れたソリューションです。64ビットコードには外部アセンブラを使用する必要があります:/

于 2010-05-15T10:27:34.047 に答える
3

アセンブリを使用するよりも、関数全体をアセンブリで記述することを好みinlineます。これにより、ビルド プロセス中に高水準言語関数をアセンブリ関数と交換できます。また、コンパイラの最適化が邪魔になることを心配する必要もありません。

1 行のアセンブリを記述する前に、関数のアセンブリ言語リストを出力します。これにより、構築または変更するための基盤が得られます。もう 1 つの便利なツールは、アセンブリとソース コードを織り交ぜることです。これにより、コンパイラが特定のステートメントをどのようにコーディングしているかがわかります。

大きな関数のインライン アセンブリを挿入する必要がある場合は、インライン化する必要があるコードの新しい関数を作成します。ビルド時に再度 C++ またはアセンブリに置き換えます。

これらは私の提案です。マイレージは変動する可能性があります (YMMV)。

于 2010-05-15T20:37:23.740 に答える
1

私は組み立てが本当に好きなので、ここでは否定的な発言をするつもりはありません。コードのプロファイルを作成し、「ホットスポット」を見つけたようです。これが正しい開始方法です。また、問題の200行は、のような高レベルの構造をあまり使用していないと思いvectorます。

私は少し警告を与える必要があります:数の計算に浮動小数点演算が含まれる場合、あなたは苦痛の世界、特に専門的な指示のセット全体、および大学用語の価値のあるアルゴリズム研究に直面しています。

つまり、私があなたの場合は、逆アセンブリビューを使用して、VSデバッガーで問題のコードをステップ実行します。作業を進めながらコードを読みやすいと感じた場合、それは良い兆候です。その後、リリースコンパイルを実行し(デバッグは最適化をオフにします)、そのモジュールのASMリストを生成します。次に、改善の余地があると思われる場合は、開始する場所があります。他の人の回答はMSDNのドキュメントにリンクされています。これは非常に簡潔ですが、それでも妥当なスタートです。

于 2010-05-16T11:29:49.607 に答える
1

最初にぶら下がっている果物を探してください...

他の人が言ったように、Microsoft コンパイラは最適化がかなり苦手です。Intel の ICC などの適切なコンパイラに投資し、コードを「そのまま」再コンパイルするだけで、多くの労力を節約できる場合があります。Intel から 30 日間無料の評価ライセンスを取得して試すことができます。

また、64 ビットの実行可能ファイルをビルドするオプションがある場合、64 ビット モードで実行すると、使用可能なレジスタの数が 2 倍になるため、パフォーマンスが 30% 向上します。

于 2010-05-15T10:42:14.923 に答える