优化 Fortran 77 中的 if-then-else 语句
Optimizing if-then-else statement in Fortran 77
对于我的 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 中处理此问题的任何建议。
如果在编译时知道,那么你只需要这个函数的1个版本。似乎您只是将函数的每个版本放在它的 obj 对象文件或库中,然后 link 到适当的那个。
如果你想说它在运行时是已知的,但在过程或执行中没有改变,那么你可以有 13 个版本的代码,每个版本一个大小,并使用一组 ifs 来决定使用哪个。
如果 matrixSize 是语言意义上的编译时常量(即它是 Fortran 参数),那么我希望大多数优化编译器都能利用它,并完全消除运行时分支。
如果 matrixSize 不是编译时常量,那么您应该将其设为一个。在后来的 Fortran 语言修订版(模块)中提供的功能使得将这样的运行时常量从单个定义点传播到使用点变得非常容易。
请注意,符合 Fortran 77 也符合 Fortran 90,除了极少数例外,也将符合 Fortran 2015。
对于我的 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 中处理此问题的任何建议。
如果在编译时知道,那么你只需要这个函数的1个版本。似乎您只是将函数的每个版本放在它的 obj 对象文件或库中,然后 link 到适当的那个。
如果你想说它在运行时是已知的,但在过程或执行中没有改变,那么你可以有 13 个版本的代码,每个版本一个大小,并使用一组 ifs 来决定使用哪个。
如果 matrixSize 是语言意义上的编译时常量(即它是 Fortran 参数),那么我希望大多数优化编译器都能利用它,并完全消除运行时分支。
如果 matrixSize 不是编译时常量,那么您应该将其设为一个。在后来的 Fortran 语言修订版(模块)中提供的功能使得将这样的运行时常量从单个定义点传播到使用点变得非常容易。
请注意,符合 Fortran 77 也符合 Fortran 90,除了极少数例外,也将符合 Fortran 2015。