【发布时间】: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