【问题标题】:Optimizations lost when linking Fortran and C++ libs?链接 Fortran 和 C++ 库时优化丢失?
【发布时间】:2012-10-09 17:27:35
【问题描述】:

我们在 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++ 项目设置优化,除非它包含源(.c/.cpp 文件)并产生一些输出。但是,当包含在其他地方时,标头将受到与包含项目相同的优化。我们没有在禁用优化的代码中做任何事情(例如使用编译指示)。

更改后,我们的代码现在运行速度慢了大约 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++ 代码中的优化?

我们使用的是 Intel Fortran Composer XE 2011。

提前致谢。

【问题讨论】:

  • 您是否向英特尔的技术支持中心提出过这个问题?
  • 我在英特尔用户论坛上发布了同样的问题。因为它还涉及 C++(特别是 LINK.EXE),所以我想我也会在这里尝试。由于某些包含的标头的复杂性,可能很难重现。一些但不是所有的新函数都是内联的。

标签: c++ optimization linker fortran


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-02
    • 2018-02-19
    • 2016-05-23
    • 2011-10-26
    • 1970-01-01
    • 2014-01-18
    • 2013-10-17
    • 1970-01-01
    相关资源
    最近更新 更多