Fortran中行主顺序程序的影响

Fortran中行主顺序程序的影响,fortran,Fortran,我有一个在Linux上运行的用Fortran 77编写的大型软件,它使用多维数组存储时间索引矩阵和几个不同的序列,但索引顺序是像C一样的行主顺序。然而,Fortran是按列排序的,当值按顺序索引时,会有缓存未命中惩罚 例如,我有两个100.000 10x10矩阵系列。我将它们存储为: MATRIX(2, 100000, 10, 10) 但据我所知,如果这些值是线性访问的,Fortran的最佳声明是 MATRIX(10, 10, 100000, 2) 现在,重构所有代码以使用其他排序系统的影响

我有一个在Linux上运行的用Fortran 77编写的大型软件,它使用多维数组存储时间索引矩阵和几个不同的序列,但索引顺序是像C一样的行主顺序。然而,Fortran是按列排序的,当值按顺序索引时,会有缓存未命中惩罚

例如,我有两个100.000 10x10矩阵系列。我将它们存储为:

MATRIX(2, 100000, 10, 10)
但据我所知,如果这些值是线性访问的,Fortran的最佳声明是

MATRIX(10, 10, 100000, 2)
现在,重构所有代码以使用其他排序系统的影响很大,但我想了解一下潜在的影响

我是否有任何方法可以轻松衡量错误订购系统的影响,以评估更改该系统的潜在改进?


可能会自动测量缓存未命中或与这些数组关联的缓存未命中。

速度可能会慢几倍,但您应该尝试并测量。不,确定改进的唯一方法是实际测试两种方法。确保使用和不使用编译器优化选项进行测试。对于简单的情况,编译器能够将循环重新排序以考虑数据对齐。计时测试中要注意的一个关键问题是将子数组传递给子例程。在第一种情况下,编译器需要创建一个副本,以便将连续数据传递给子例程,而在第二种情况下,它已经设置为只传递一个指针。(当然,在f77中,为了简单地传递子数组,您必须以这种方式订购。)如果它没有损坏,请不要安装它。如果您想探究这个问题,请编写一些模拟真实程序中典型操作的小型演示程序,以进行计时测试。