gpt4 book ai didi

c++ - 链接 Fortran 和 C++ 库时优化丢失了吗?

转载 作者:太空宇宙 更新时间:2023-11-04 14:13:48 25 4
gpt4 key购买 nike

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

仅 header 方面很重要的原因是,除非它包含源(.c/.cpp 文件)并产生一些输出,否则无法在项目属性中为 C++ 项目设置优化。但是,当包含在其他地方时, header 将受到与包含项目相同的优化。我们没有在代码中做任何禁用优化的事情(例如使用编译指示)。

更改后,我们的代码现在运行速度降低了大约 50%。我们只调用新包含的 header 中的一个函数,该函数的开销很小,并且不考虑减速。 AQTime 中的分析显示整个代码的减速是一致的。

我认为可能导致此问题的原因是无意中禁用了优化。在链接 Fortran EXE 时,我们收到大量 C4748 警告,关于优化已在新包含的 header 中定义的各种函数中被禁用,以及在和其他也包含它们的 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)。

Process explorer 显示 Fortran 链接器 XLink.exe 正在调用 C++ 链接器 LINK.exe。

谁能解释这里发生了什么,以及如何确保在 Fortran 中保持链接 C++ 代码的优化?

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

提前致谢。

最佳答案

最后,我们注意到在我们的几个 C++ 静态库项目中禁用了优化,这些项目在包含新 header 的调用图的下方。这发生在添加新 header 之前的一段时间,但很明显,只有在链接新代码时,性能才会受到影响。重新打开优化已解决问题;让我们分心的是 LINK.EXE 被 XLINK 调用——事实证明 link.exe 只是 Windows 链接器——它不是特定于 C++ 的。

关于c++ - 链接 Fortran 和 C++ 库时优化丢失了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12805245/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com