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

时间:2015-09-08 20:28:35

标签: if-statement optimization fortran fortran77

对于我的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 个答案:

答案 0 :(得分:1)

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

如果matrixSize不是编译时常量,那么你应该将其设为1。后来的Fortran语言修订版(模块)中提供的工具使得将这样的运行时常量从单个定义点传播到使用点非常容易。

请注意,符合Fortran 77标准也符合Fortran 90标准,除极少数例外情况外,它也符合Fortran 2015标准。

答案 1 :(得分:0)

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

如果您想在运行时中知道它,但不会改变课程或执行,那么您可以拥有13个版本的代码,每个版本对应一个,并使用一组ifs决定使用哪个。