1

我们在 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。

提前致谢。

4

1 回答 1

0

最后,我们注意到在我们的几个 C++ 静态库项目中禁用了优化,在调用图的下方,包括新的标头。这发生在添加新标头之前的一段时间,但显然只有在链接新代码时才会发现性能损失。重新开启优化已经解决了这个问题;让我们分心的是 LINK.EXE 被 XLINK 调用 - 原来 link.exe 只是 windows 链接器 - 它不是 C++ 特定的。

于 2012-10-10T12:49:09.147 回答