6

我知道一个广泛的问题,但是:

有没有人有关于提高 Fortran 程序执行速度的一般提示?

4

6 回答 6

12

广泛问题的广泛答案:

while (the speed is not satisfied)
    Use a profile to find the bottle neck 
    optimize that part of code.
于 2009-08-19T09:59:45.627 回答
4

正如其他人建议的那样,在考虑修改您的代码之前对其进行概要分析。

但是你能做的最好的事情就是仔细阅读编译器手册,逐行、逐字地阅读,并仔细注意它给你的所有选项。根据我的经验(我在计算电磁学的 HPC 方面有很多经验,而不是您应该相信您在此处阅读的内容!)您可以通过智能使用编译器在性能优化方面获得最大的收益。

一旦你用尽了编译器的可能性(正如其他一位受访者建议的那样,确保你有一个好的编译器——它们并不昂贵,而且对于大多数从 g95 到付费编译器)那么你不应该开始做这样的事情:

-- 循环展开;

-- 指令重新排序;

-- 函数内联;

- 我们过去一直在做的其他事情。

通过良好的优化编译器,大多数代码调整工作现在已经完成,比我们基于碳的生命形式做得更好。

如果您必须修改,修改内存访问 - 例如平铺您对数组的访问以利用缓存。如果您这样做,请参数化您的图块大小(等),以便在明年或后年将其移动到不同的架构时,您只需调整一些参数而不是再次修改代码。

最后,玩得开心,优化 Fortran 程序的性能是度过工作日的好方法!

于 2009-08-19T10:25:35.060 回答
1

只是因为没有人提到它:

  • 购买更快的机器

(请不要打我:-) ...)

于 2009-08-19T10:28:57.160 回答
1

这是一个非常广泛的领域,但是...

  • 如果您正在做矩阵运算,请考虑为此查看现成的库。它们可能更快,并且有些支持多线程,这将提高多处理器机器的性能。

  • 正如 pierr 所建议的那样进行剖析。这将告诉您您的程序实际花费的时间。了解这一点可以让您将注意力集中在实际需要调整的位上。

  • 缓存行和字对齐以及优化块以适应处理器缓存。这些被认为与 C 编程更密切相关,因为使用 C 更容易控制这类事情。但是,同样的问题可能会导致 FORTRAN 程序出现问题,原因大致相同。

    现代 CPU 上的缓存未命中损失非常大,在某些情况下,优化缓存使用会产生数量级的差异。如果您认为这是一个问题,您可能需要用 C 重写核心计算,以便对数据结构进行更细粒度的控制。

  • 如果您真的受 CPU 限制,您可能会从 GPU 编程等技术中获得一些帮助。

于 2009-08-19T10:12:44.947 回答
0

我熟悉的 Fortran 代码与其他语言的代码有很大的不同。在其他语言中,数据结构占主导地位,同时还有抽象层、深度调用堆栈和过度调用导致的速度下降

另一方面,Fortran 倾向于用于数学繁重的算法,具有大数组,并且没有那么多调用深度。在这些问题中,缓存局部性问题显得更加突出,还有算法问题。例如,我经常使用非线性混合效应建模,而公差、前向或中心差异梯度、解析梯度等问题至关重要。诸如 Runge-Kutta、隐式方法、矩阵指数或封闭形式等 ODE 求解方法会产生巨大的差异。

此外,如果您可以(通过抽样)识别出真正的热点代码部分(即 PC 花费大部分时间而不调用子例程的部分)并且在您实际编译的代码中(而不是在第 3 方库中) ) 然后打开编译器优化会有所作为。

就我个人而言,我不关心 Fortran 编译器通常会做的那种优化,它们会扰乱代码以减少使用少于 1% 时间分数的代码中的周期,同时使其调试变得非常困难。

于 2009-08-30T16:35:54.613 回答
0

除了:

  • 优化你的算法
  • 优化数据访问模式
  • 使用最先进的编译器,例如支持 OMP 的编译器
  • 考虑将高度关键的代码移至为您提供更多选择的环境 - 例如移至 C/C++ 代码以利用线程并行化和 SIMD 指令)

还有一些可用的材料,谷歌搜索 fortran 优化,例如出现,例如this (PDF)this。但是,请注意旧文献及其假设:不久前,许多平台的优化指南(正确地)假设内存是稀缺的,内存访问很便宜,指令很贵。不再这样了。

于 2009-08-19T10:11:34.450 回答