【问题标题】:Optimizing if-then-else statement in Fortran 77在 Fortran 77 中优化 if-then-else 语句
【发布时间】:2015-09-09 06:46:52
【问题描述】:

关于我的 C++ 代码,我在两天前问过这个question。但是我现在意识到我必须在 Fortran 中进行编码,因为我编写的内核将成为用 Fortran 77 编写的现有应用程序的一部分。因此我再次发布这个问题,这次的上下文是 Fortran。谢谢。

根据从 8x8 到 20x20 的矩阵大小,我有不同的方阵乘法函数。这些函数彼此不同,因为每个函数都采用不同的优化策略,即不同的循环排列和不同的循环展开因子。矩阵大小在程序的生命周期内是不变的,并且在编译时是已知的。我的目标是减少决定必须使用哪个功能的时间。例如,一个简单的实现是:

if (matrixSize == 8) C = mxm8(A, B);
else if (matrixSize == 9) C = mxm9(A,B);
 ...
else if (matrixSize == 20) C = mxm20(A,B);

在这种情况下,决定每次矩阵乘法使用哪个函数所花费的时间是非常重要的,特别是因为矩阵乘法在代码中经常发生。提前感谢有关如何在 Fortran 77 中处理此问题的任何建议。

【问题讨论】:

  • 为什么一定要F77?您可以使用选择案例或函数指针来解决这个问题,我不认为这些会更慢。
  • if 语句所花费的时间与矩阵乘法相比应该可以忽略不计。您可以做的最好的事情是将 mxm 函数放在同一个文件中,以便编译器最终能够内联 mxm 函数。如果不能,请让您的编译器在不同文件之间进行内联。
  • 我看到已经有一个可以接受的答案,但我在徘徊,如果对于这种大小的矩阵(最大为 20x20)它是值得的工作。这些矩阵将适合当今几乎任何计算机的缓存,使其对优化几乎不敏感。你有没有偶然发现你的算法版本之间有什么区别?
  • @haraldkl:它必须是 F77,因为主要应用程序是 F77,我无权更改它。
  • @AnthonyScemama:感谢您的意见。

标签: if-statement optimization fortran fortran77


【解决方案1】:

如果 matrixSize 是语言意义上的编译时间常数(即它是 Fortran PARAMETER),那么我希望大多数优化编译器能够利用这一点,并完全消除运行时分支。

如果 matrixSize 不是编译时间常数,那么您应该将其设为一个。稍后的 Fortran 语言修订版(模块)中提供的功能使得将此类运行时常量从单个定义点传播到使用点变得非常容易。

请注意,符合 Fortran 77 的同时也符合 Fortran 90,除了极少数例外,还将符合 Fortran 2015。

【讨论】:

  • matrixSize 确实是一个 Fortran PARAMETER。当我调试我的可执行文件时,我发现 if 语句正在被评估。
  • 如果你能理解调试你的可执行文件,那么你还没有启用编译器的完整优化功能,或者你正在使用一个优化非常弱的编译器。
  • 我使用了“gfortran -g”,但是有没有办法确定分支正在被淘汰,可能缺少读取相应的程序集?
  • 这里的一个简单测试(我显然不知道你的实际 Fortran 代码是什么......)与 gfortran -g -S 导致相关范围的汇编,不引用任何程序之外的任何内容如果在源中分支,那是相关将始终被选择的目标。即使我不知道各种汇编程序助记符的含义(几乎就是这种情况!),这告诉我编译器已经消除了分支。用你自己的代码试试吧。
  • @Jeff 使用预处理器会倒退。它没有提供任何好处(生产编译器将进行必要的优化),但具有不可忽略的可移植性和复杂性成本。
【解决方案2】:

如果在编译时就知道了,那么你只需要这个函数的 1 个版本。似乎您只是将函数的每个版本都放在其 obj 对象文件或库中,然后链接到相应的。

如果您的意思是说它在 运行时 是已知的,但不会随着课程或执行而改变,那么您可以拥有 13 个版本的代码,每种大小一个,并使用一组 ifs 来决定使用哪个。

【讨论】:

  • 适当的目标文件的链接时间选项是否会出现问题,每个目标文件中的函数必须具有相同的名称,例如“mxm”才能被代码正确引用?
猜你喜欢
  • 1970-01-01
  • 2023-03-28
  • 2020-11-23
  • 2011-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-13
  • 1970-01-01
相关资源
最近更新 更多