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を使用しています。
前もって感謝します。