我知道一个广泛的问题,但是:
有没有人有关于提高Fortran程序执行速度的一般提示?
答案 0 :(得分:12)
对广泛问题的广泛回答:
while (the speed is not satisfied)
Use a profile to find the bottle neck
optimize that part of code.
答案 1 :(得分:4)
正如其他人建议在修改代码之前对代码进行概要分析。
但是,您可以做的最好的事情是仔细阅读编译器手册,逐行,逐字逐句,并注意它给你的所有选项。根据我的经验(我在计算电磁学的HPC方面有很多经验,而不是你应该相信你在这里阅读的内容!)通过智能地使用编译器,你可以获得最大的性能优化。
一旦你已经厌倦了编译器的可能性(并且正如其他受访者之一建议确保你有一个好的编译器 - 它们并不昂贵,并且大多数程序的执行时间减少了40% g95到付费编译器)然后你不应该开始做这样的事情:
- 循环展开;
- 指令重新排序;
- 函数内联;
- 我们过去常常做的其他事情。
这些代码调整的大部分内容现在已经完成,通过良好的优化编译器,比基于碳的生命形式更好。
如果你必须修改,修改内存访问 - 例如,平铺你对数组的访问权以利用缓存。如果这样做,请参数化您的磁贴大小(等),以便在将其移动到其他架构时,明年或之后,您只需调整一些参数,而不是再次修改代码。
最后,玩得开心,优化Fortran程序的性能是度过工作日的好方法!
答案 2 :(得分:1)
这是一个非常广泛的领域,但是......
如果您正在进行矩阵运算,请考虑为此研究现成的库。它们可能更快,有些支持多线程,这将为您提供多处理器机器的性能提升。
剖析,正如皮尔所说。这将告诉您程序实际花费时间的位置。了解这一点后,您可以将注意力集中在实际需要调整的位上。
缓存行和字对齐以及优化块以适合处理器缓存。这些被认为与C编程更密切相关,因为用C来控制这类事情更容易。然而,出于同样的原因,同样的问题可能会导致FORTRAN程序出现问题。
缓存未命中罚款在现代CPU上非常大,并且针对高速缓存使用进行优化可以在某些情况下产生数量级的差异。如果您认为这是一个问题,您可能需要在C中重新编写核心计算,以便对数据结构进行更细粒度的控制。
如果你真的受CPU限制,你可能会从GPU编程等技术中获得一些里程。
答案 3 :(得分:1)
因为没有人提到它:
(拜托,请不要打我:-) ......)
答案 4 :(得分:0)
除了以下任何特定的财富:
还有一些可用的资料,谷歌搜索fortran优化,例如如上所述this (PDF)和this。但是,要小心旧文献及其假设:不久前,许多平台的优化指南(正确地)假设内存稀缺,内存访问便宜且说明费用昂贵。不再那样了。
答案 5 :(得分:0)
我熟悉的Fortran代码与其他语言的代码非常不同。在其他语言中,数据结构更加突出,包括抽象层,深层调用堆栈和slowdown caused by excess calls。
另一方面,Fortran倾向于习惯于数学繁重的算法,使用大数组,而不是调用深度。在这些问题中,缓存局部性问题变得更加严重,而且算法问题也就越来越多。例如,我使用非线性混合效应建模工作很多,并且诸如公差,前向或中心差异梯度,分析梯度等问题是至关重要的。 ODE求解方法如Runge-Kutta,隐式方法,矩阵指数或闭合形式都会产生巨大的差异。另外,如果你能(通过抽样)识别真正热点的代码部分(即PC花费大部分时间而不调用子程序)并且在代码中你实际编译(不是在第3代) -party library)然后打开编译器优化就会有所作为。
就个人而言,我并不关心Fortran编译器通常会做的各种优化,在代码中加扰代码以减少使用不到1%时间分数的代码,同时使调试变得非常困难。