代码之家  ›  专栏  ›  技术社区  ›  Tania

在Fortran 77中优化if-then-else语句

  •  1
  • Tania  · 技术社区  · 10 年前

    对于我的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中处理此问题的任何建议。

    2 回复  |  直到 9 年前
        1
  •  1
  •   IanH    10 年前

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

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

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

        2
  •  0
  •   Scott Hunter    10 年前

    如果在编译时已知,则只需要此函数的一个版本。看起来您只是将函数的每个版本放在其obj对象文件或库中,然后链接到相应的版本。

    如果你想说这在 运行时间 ,但在过程或执行过程中不会改变,那么您可以有13个版本的代码,每个大小一个,并使用一组if来决定使用哪个。