1

Visual Studio 2010には、Fortranexeと複数のFortranおよびC++静的ライブラリプロジェクトで構成される大規模なソリューションがあります。

FORTRAN EXE --> MY_LIB (C++)
--> MY_LIB_2 (C++)
--> MY_LIB_3 (Fortran)

C ++静的ライブラリの依存関係を変更した後、EXEの実行時パフォーマンスが約50%低下するという問題が発生しました。

C ++ライブラリの1つでいくつかの追加のヘッダーファイルを参照するまで、すべてが正常に実行されていました。これらのヘッダーは、ソースファイルを含まず、C ++ヘッダーファイルのみを含むプロジェクトに含まれているため、独自のコンパイル済み出力を生成しません。

FORTRAN EXE --> MY_LIB (C++, now includes headers from headers-only project)
--> MY_LIB_2 (C++)
--> MY_LIB_3 (Fortran)

ヘッダーのみの側面が重要である理由は、ソース(.c / .cppファイル)が含まれ、何らかの出力が生成されない限り、プロジェクトプロパティでC++プロジェクトの最適化を設定できないためです。ただし、他の場所にインクルードする場合、ヘッダーはインクルードプロジェクトと同じ最適化の対象になります。コードでは、最適化を無効にするものは何もしていません(プラグマなど)。

変更後、コードの実行速度は約50%遅くなりました。新しく含まれたヘッダーで、オーバーヘッドがほとんどなく、速度低下を考慮しない関数を1つだけ呼び出しています。AQTimeでのプロファイリングにより、速度低下がコード全体で一貫していることがわかります。

これを引き起こしていると私が信じているのは、最適化が誤って無効にされていることです。Fortran EXEがリンクされた時点で、新しく含まれるヘッダーで定義されたさまざまな関数、およびそれらを含む他のcppファイルで最適化が無効になっているというC4748警告が多数表示されます(受信しませんでした)。追加のヘッダーを含める前にこれら):

------ Build started: Project: FortranEXEProject, Configuration: Release Win32 ------
Linking...
   Creating library D:\Source\Release\FortranEXEProject.lib and object D:\Source\Release\FortranEXEProject.exp
Generating code
c:\program files (x86)\microsoft visual studio 10.0\vc\include\memory(620) : warning C4748: /GS can not protect parameters and local variables from local buffer overrun because optimizations are disabled in function
d:\Source\CPPHeaderLibrary\header1.hpp(3231) : warning C4748: /GS can not protect parameters and local variables from local buffer overrun because optimizations are disabled in function
d:\Source\CPPSourceLibrary\source.cpp(54) : warning C4748: /GS can not protect parameters and local variables from local buffer overrun because optimizations are disabled in function

すべてのプロジェクトで最適化が有効になっており、リンク時コード生成(/ LTCG)を使用しています。

プロセスエクスプローラーは、FortranリンカーXLink.exeがC++リンカーLINK.exeを呼び出していることを明らかにします。

ここで何が起こっているのか、そしてリンクされたC ++コードの最適化がFortranで維持されるようにする方法を誰かが説明できますか?

Intel Fortran ComposerXE2011を使用しています。

前もって感謝します。

4

1 に答える 1

0

結局、新しいヘッダーを含むコールグラフのさらに下にあるいくつかのC++静的ライブラリプロジェクトで最適化が無効になっていることに気づきました。これは、新しいヘッダーを追加する前に発生しましたが、明らかにパフォーマンスへの影響は、新しいコードがリンクされたときにのみ明らかになりました。最適化をオンに戻すと、問題が修正されました。気が散ったのは、XLINKによって呼び出されているLINK.EXEでした。link.exeは単なるWindowsリンカーであり、C++固有ではありません。

于 2012-10-10T12:49:09.147 に答える