我们在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文件)并产生一些输出,否则无法在Project Properties中为C ++项目设置优化。但是,当包含在其他地方时,标题将与包含项目进行相同的优化。我们在代码中没有做任何禁用优化的事情(例如使用编译指示)。
更改后,我们的代码现在运行速度慢了约50%。我们只调用新包含的标题中的一个函数,这些函数几乎没有开销,也没有考虑到减速。 AQTime中的分析显示整个代码中的减速是一致的。
我认为可能导致这种情况的原因是无意中禁用了优化。在Fortran EXE链接的那一点上,我们收到大量关于在新包含的头文件中定义的各种函数中禁用的优化的C4748警告,以及包含它们的in和其他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。
提前致谢。
答案 0 :(得分:0)
最后,我们注意到在我们的几个C ++静态库项目中已经禁用了优化,这些项目位于包含新标头的调用图之下。这种情况发生在添加新标题之前的一段时间,但显然只有在链接新代码时才会显示性能。重新开始优化已经解决了问题;让我们分心的是LINK.EXE被XLINK调用 - 事实证明link.exe只是Windows链接器 - 它不是特定于C ++的。