Performance 提高fortran编译器性能(编译时和内存)

Performance 提高fortran编译器性能(编译时和内存),performance,compilation,fortran,gfortran,Performance,Compilation,Fortran,Gfortran,我有一个使用cmake和make或visual studio构建的跨平台项目,主要使用Fortran源代码。源文件的大小从1000行(10s到100s KB)到最大的31000行(1.3MB)不等。但是,即使与make-jN并行,编译时间也在20分钟左右。有14个模块最终被导入并链接以构建最终的可执行文件。模块可以静态或动态链接。这是花费所有时间的最后一步:编译可执行文件的源文件并链接模块库。我在用gfortran(gcc@7.3)和ifort(英特尔2017)编译器 上面提到的31000行文件

我有一个使用cmake和make或visual studio构建的跨平台项目,主要使用Fortran源代码。源文件的大小从1000行(10s到100s KB)到最大的31000行(1.3MB)不等。但是,即使与
make-jN
并行,编译时间也在20分钟左右。有14个模块最终被导入并链接以构建最终的可执行文件。模块可以静态或动态链接。这是花费所有时间的最后一步:编译可执行文件的源文件并链接模块库。我在用gfortran(gcc@7.3)和ifort(英特尔2017)编译器

上面提到的31000行文件是在可执行源代码中导入的,而不是在任何底层库中导入的。我尝试过将可执行源文件分解成更小的文件,尽管它们一开始相对较小。但是,可执行源最终会导入链接的库的很大一部分。我还尝试只导入大型库中需要的部分,而不是全部。例如,我已经用这个
USE ModuleSubs
替换了这个
USE ModuleSubs,只在一些模块中使用了:ElemOpen
,但它在编译速度上还没有产生任何变化。这就是说,这很难精确计时,因为我每次都在更改不同的文件,这意味着每次编译尝试都与以前不同

在一些系统(例如cygwin和docker容器)上,fortran编译器内存不足,并因以下错误而中止:

f951:在总计2601426944字节之后分配65536字节的内存不足

此错误总是发生在可执行文件编译步骤中


我想了解是什么因素导致编译速度慢,并在编译步骤中消耗内存。

您应该告诉我们有关您的设置的更多信息,否则您的问题太广泛,因此离题。你的源文件有多大?是否有任何文件需要花费大量时间?还是链接需要很多时间?您使用哪个编译器版本?您使用哪些编译器标志?在哪个操作系统上?你们有长的模块级联吗?有时,编译器错误可能会导致编译时间过长,但如果没有错误,则无法识别这些错误。请回答所有问题,不要只选择一两个。@VladimirF谢谢你的回答,我更新了问题。你认为模块级联的“长”是什么,一系列后续的输入或更像5-10?我将尝试生成我的项目导入链的图表,这样我就可以准确地告诉你。我的意思不仅仅是几个。有些问题可能会产生问题,您可以通过在此处搜索找到其中一些问题。但这些主要涉及单个源文件。事实证明,在调试模式下构建可以避免
内存不足的错误。所以我想这说明优化是内存消耗?模块级联的答案很快就会出来。是的,这是很有可能的。现在试着找出哪些优化可以做到这一点,以及在哪个文件中。或者它们是链接时间优化?你真的应该告诉我们更多关于你的设置,否则你的问题太广泛,因此离题了。你的源文件有多大?是否有任何文件需要花费大量时间?还是链接需要很多时间?您使用哪个编译器版本?您使用哪些编译器标志?在哪个操作系统上?你们有长的模块级联吗?有时,编译器错误可能会导致编译时间过长,但如果没有错误,则无法识别这些错误。请回答所有问题,不要只选择一两个。@VladimirF谢谢你的回答,我更新了问题。你认为模块级联的“长”是什么,一系列后续的输入或更像5-10?我将尝试生成我的项目导入链的图表,这样我就可以准确地告诉你。我的意思不仅仅是几个。有些问题可能会产生问题,您可以通过在此处搜索找到其中一些问题。但这些主要涉及单个源文件。事实证明,在调试模式下构建可以避免
内存不足的错误。所以我想这说明优化是内存消耗?模块级联的答案很快就会出来。是的,这是很有可能的。现在试着找出哪些优化可以做到这一点,以及在哪个文件中。或者它们是链接时间优化?