我们在 Visual Studio 2010 中有一个大型解决方案,其中包括一个 Fortran exe 和多个 Fortran 和 C++ 静态库项目:
FORTRAN EXE --> MY_LIB (C++)
--> MY_LIB_2 (C++)
--> MY_LIB_3 (Fortran)
在修改 C++ 静态库依赖项后,我们遇到了 EXE 的运行时性能下降约 50% 的问题。
一切都运行良好,直到我们在其中一个 C++ 库中引用了一些额外的头文件。这些头文件包含在一个项目中,该项目不包含任何源文件,仅包含 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%。我们只在新包含的标头中调用了一个函数,该函数的开销很小,并且不考虑减速。AQTime 中的分析表明,整个代码的减速是一致的。
我认为可能导致这种情况的原因是无意中禁用了优化。在链接 Fortran EXE 时,我们收到大量 C4748 警告,关于在新包含的标头中定义的各种功能中禁用优化,以及其他 cpp 文件也包含它们(我们没有收到这些在包括附加标题之前):
------ 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。
谁能解释这里发生了什么,以及如何确保在 Fortran 中维护链接 C++ 代码中的优化?
我们正在使用英特尔 Fortran Composer XE 2011。
提前致谢。