FORTRAN矩阵运算的性能(performance of fortran matrix opera

2019-10-31 10:58发布

我需要使用Fortran语言而不是C的地方,我非常新的Fortran。 我试图做一些大的计算,但是它是相当缓慢相比C(也许10倍以上,我使用英特尔的编译器两种)。 我想原因是Fortran将保持在列为主格式矩阵,我试图做这样和运算(矩阵(I,J,:)),因为它是列为主,大概这使用缓存的效率非常低(可能不是使用的话)。 但是,我不知道这是否是实际的原因(因为我的Fortran知道这么少)。 问题是,在Fortran语言的惯例是做列向量,而不是行向量操作?

(顺便说一句:我查过的Fortran已经使用英特尔的LAPACK库的速度,这是相当快的,所以它不涉及任何编译或构建的问题。)

谢谢。

地方

Answer 1:

尝试做矩阵运算时,例如,如果你在C这样的改变你的循环顺序:

for (i = 0; i < M; ++i) // for each row
{
    for (j = 0; j < N; ++j) // for each col
    {
        // matrix operations on e.g. A[i][j]
    }
}

然后用Fortran你想第j(列)环路外环和我(行)环路内环。

另一种方法,可达到同样的事情,是保持环路,因为它们是但改变数组,例如定义如果用C是A[x][y][z][t]然后在FORTRAN使它A[t][z][y][x]假设t是最快变化的循环索引和x最慢。



Answer 2:

由于如你写,Fortran的是柱主要与所述第一指数在存储器布局变化的速度最快,所以总和(基质(I,J,:))引起的非连续位置的总和。 如果这是真的操作速度较慢的原因,那么你可以重新定义你的矩阵有不同的顺序维度,使目前的第三维是第一。 是的,如果这是你的主要计算,重新排列矩阵,以使求和一列操作。 显式循环应尽可能早指数最快,由@PaulR描述。 如果您以前曾认为最佳的指标顺序的C和正在改变的Fortran,这可能需要改变的一个方面。 不过,虽然这在理论上是正确的,我怀疑它真正重要的是多在实践中,除非也许数组是巨大的。 (更糟的情况是阵列的一部分是在磁盘上的交换内存和一部分!)有关运行时的速度问题的第一条规则就是不要猜...措施。 它通常是算法。



文章来源: performance of fortran matrix operations