If statement fortran77中if-then-else语句的优化 我的C++代码,大约两天前我问过这个问题。但我现在意识到,我必须用Fortran编写代码,因为我编写的内核将是用Fortran 77编写的现有应用程序的一部分。因此,我再次发布这个问题,这次的上下文是Fortran。多谢各位

If statement fortran77中if-then-else语句的优化 我的C++代码,大约两天前我问过这个问题。但我现在意识到,我必须用Fortran编写代码,因为我编写的内核将是用Fortran 77编写的现有应用程序的一部分。因此,我再次发布这个问题,这次的上下文是Fortran。多谢各位,if-statement,optimization,fortran,fortran77,If Statement,Optimization,Fortran,Fortran77,根据从8x8到20x20的矩阵大小,我有不同的平方矩阵乘法函数。这些函数彼此不同,因为它们采用不同的优化策略,即不同的循环排列和不同的循环展开因子。矩阵大小在程序生命周期内是不变的,在编译时是已知的。我的目标是减少决定必须使用哪个函数的时间。例如,一个简单的实现是: if (matrixSize == 8) C = mxm8(A, B); else if (matrixSize == 9) C = mxm9(A,B); ... else if (matrixSize == 20) C = mx

根据从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中处理此函数的建议。

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


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

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

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


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

matrixSize确实是一个Fortran参数。当我调试我的可执行文件时,我发现if语句得到了评估。如果你能理解调试可执行文件的意义,那么你还没有启用编译器的完全优化功能,或者你正在使用一个优化能力极弱的编译器。我用的是“gfortran-g”,但是,有没有一种方法可以确定分支正在被消除,可能是因为没有读取相应的程序集?这里有一个简单的测试(我显然不知道实际的Fortran代码是什么…)使用gfortran-g-S结果,相关范围的汇编不会引用任何内容,如果源中存在分支,则始终会选择作为相关范围目标的过程。即使我不知道各种汇编程序助记符是什么意思(事实就是如此!),这也告诉我编译器已经消除了分支。用你自己的代码试试。@Jeff使用预处理器是倒退的。它没有任何好处(生产编译器将进行必要的优化),但带来了不可忽略的可移植性和复杂性成本。每个目标文件中的函数必须具有相同的名称,例如“mxm”,这难道不是指向相应目标文件的链接时间选项的问题吗被代码正确引用?为什么必须是F77?你可以用一个select case或者一个函数指针来解决这个问题,我认为它们不会再慢了。与矩阵乘法相比,if语句所花费的时间应该可以忽略不计。最好将mxm函数放在同一个文件中,这样编译器最终将能够内联mxm函数。如果不能,请让编译器在不同的FIE之间进行内联。我看到已经有了一个公认的答案,但我想知道,对于这样大小的矩阵(最大20x20),这样的工作是否值得。这些矩阵将适用于当今几乎所有计算机的缓存,使其对优化几乎不敏感。你有没有偶然发现不同版本的算法有什么不同?@haraldkl:应该是F77,因为主应用程序是F77,我没有权力改变它。@Anthonyscema:谢谢你的输入。