12

VS2015 C++/MFCアプリケーションをVS2015に移植し、VS2015コンパイラによって生成されたパフォーマンスとコードにかなり厄介な問題があります。Visual Studio 2015でのlog10()パフォーマンスが、Visual Studio 2013 for x86よりずっと遅い

メモこれはx86用です。

log10()呼び出しではそれよりも遅くなります。 CPUサンプリングを使用してリリースビルドをプロファイリングするとき、これらの呼び出しが以前よりも多くの時間を要することがわかります。例: VS2015の同じランで49サンプル、VS2015で同じランで7545サンプル。これは、この機能が問題のアプリケーションのCPU負荷の0.6%から50%になることを意味します。 VS2013プロファイラで

は示していますVS2015プロファイラで

Function Name Inclusive Samples Exclusive Samples Inclusive Samples % Exclusive Samples % 
__libm_sse2_log10 49 49 0.61 0.61 

は示しています

Function Name Inclusive Samples Exclusive Samples Inclusive Samples % Exclusive Samples % 
___sse2_log102 7,545 7,545 50.43 50.43 

なぜ別の関数名?

log10の生成されたアセンブリを簡単に見ました。 VS2013では、これはdisp_pentium4.inclog10_pentium4.asmに転送されます。 VS2015ではこれが異なります。それはVS2015がデバッグの__libm_sse2_log10に戻るようです。

__sse2_log102は、このパフォーマンスの違いだけの原因になることはありますか?これらを呼び出す関数から出力された結果は、予想される浮動小数点の違いの範囲内にあることを確認しました。

Optimization

Code generation

すべてのプロジェクト設定は、次のとおりです。プロパティを表示するとき

/Yu"stdafx.h" /MP /GS- /GL /analyze- /W4 /wd"4510" /wd"4610" /Zc:wchar_t /Z7 /Gm- /Ox /Ob2 /Zc:inline /fp:fast /D "WINVER=0x0501" /D "WIN32" /D "_WINDOWS" /D "NDEBUG" /D "_CRT_SECURE_NO_WARNINGS" /D "_CRT_SECURE_NO_DEPRECATE" /D "_SCL_SECURE_NO_WARNINGS" /D "_USING_V110_SDK71_" /D "_UNICODE" /D "UNICODE" /errorReport:prompt /WX- /Zc:forScope /GR /arch:SSE2 /Gd /Oy /Oi /MT 

また、ここに示す:

私たちは、目標v140_xpでコンパイルされており、以下のコンパイルオプションがいますVS2013とVS2015の両方で同じです。 SSE2を使用しており、浮動小数点モデルを高速に設定していることに注意してください。

誰もが同じ問題を抱えており、これを解決する方法を知っていますか?

+0

マイクロソフトが実質的にライブラリを書き直したということがあります。 [このブログの記事](http://blogs.msdn.com/b/vcblog/archive/2015/09/25/rejuvenating-the-microsoft-c-c-compiler.aspx)には、数学ライブラリが含まれています。おそらく、あなたが比較する2つのバージョンの間で書き換えが起こります。 –

+1

VS2015の "__sse2_log102"実装に向いている点がすべて原因です。古い実装よりも遅いです。 「log10()」の呼び出しをippsLog10_64f_A53の呼び出しに置き換えると、このパフォーマンス回帰は削除されます。 – nietras

+0

@PeterSchneiderありがとうございました。はい、私たちはポートに浮動小数点から文字列の書式設定に関する問題があったため、これについて認識していました。これも完全に書き直されています。 – nietras

答えて

5

ここに回答として私のコメント。

代わりに古い__libm_sse2_log10のこの新しい__sse2_log102関数を呼び出す場合は、構築し、この新しい実装は、巨大なパフォーマンスの違いの原因であることをVS2015でのリリースでlog10の実装を変更したことが表示されます。

この場合の修正プログラムは、Intels Performance Primitives(IPP)ライブラリで使用可能な実装を呼び出すことでした。例えば。代わりに呼び出す:

return log10(v); 

代わりにこのコール:

double result; 
ippsLog10_64f_A53(&v, &result, 1); 
return result; 

は、これは実際にはわずかに速い古いIPP 7.0のリリースを使用していた、消滅するパフォーマンス上の問題が生じました。しかし、すべてがIPPを使用して料金を支払うわけではないので、Microsoftがこれを修正することを願っています。

以下は、この問題を示しているVS2015のバージョンです。

enter image description here

関連する問題