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 に感謝します。