2

VS2010 でエクササイズ アプリケーションを最適化しようとしています。基本的に、コアループにいくつかのsqrt、pow、およびmemsetがあります。より具体的には、これは私がしていることです:

// in a cpp file ...
#include <cmath>

#pragma intrinsic(sqrt, pow, memset)
void Simulator::calculate() 
{
  for( int i=0; i<NUM; i++ )
  {
    ...
    float len = std::sqrt(lenSq);
    distrib[0] = std::pow(baseVal, expVal);
    ...
    clearQuad(i); // invokes memset
  }
}

ビルド後、逆アセンブリは、たとえば、sqrt 呼び出しが "call _CIsqrt(0x####)" としてコンパイルされることを示します。/Oi フラグが有効かどうかに関係なく、何も変わりません。

組み込みバージョンを有効にする方法と、逆アセンブリコードでそれを確認する方法を教えてください。 (プロジェクト設定で /O2 も有効にしました。)

ありがとうございました

編集: /fp:fast を追加することで問題が解決しました。例として、sqrt の場合、組み込みバージョンは単一の「fsqrt」を使用して、標準バージョンの「call __CIsqrt()」を置き換えます。悲しいことに、私の場合、組み込みバージョンは 5% 遅くなります。

Zan Lynx と mch に感謝します。

4

2 に答える 2

2

C++ std 名前空間を使用すると、コンパイラが組み込み関数を使用しない可能性があります。、、およびコールstd::から削除してみてください。sqrtpowmemset

MSDN ライブラリのドキュメントに#pragma intrinsicは、組み込みが実際に使用されているかどうかをテストするための例が-FAs示されています。フラグを使用してコンパイルし、結果の .asm ファイルを確認します。

デバッガーで逆アセンブリを見ると、既に行っているように見えますが、. ではなく組み込みも表示されるはずcallです。

于 2010-10-29T03:58:04.410 に答える
1

.NET CLR ではなく、マシン コードにコンパイルしています。右?

.NET にコンパイルすると、コードは JIT を介して実行されるまで最適化されません。その時点で、.NET には独自の組み込み関数があり、その他の処理が行われます。

ネイティブ マシン コードにコンパイルする場合は、/arch オプション/fp:fast オプションを試してみてください。

于 2010-10-29T04:33:48.110 に答える