我需要使用Fortran语言而不是C的地方,我非常新的Fortran。 我试图做一些大的计算,但是它是相当缓慢相比C(也许10倍以上,我使用英特尔的编译器两种)。 我想原因是Fortran将保持在列为主格式矩阵,我试图做这样和运算(矩阵(I,J,:)),因为它是列为主,大概这使用缓存的效率非常低(可能不是使用的话)。 但是,我不知道这是否是实际的原因(因为我的Fortran知道这么少)。 问题是,在Fortran语言的惯例是做列向量,而不是行向量操作?
(顺便说一句:我查过的Fortran已经使用英特尔的LAPACK库的速度,这是相当快的,所以它不涉及任何编译或构建的问题。)
谢谢。
地方
尝试做矩阵运算时,例如,如果你在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
最慢。
由于如你写,Fortran的是柱主要与所述第一指数在存储器布局变化的速度最快,所以总和(基质(I,J,:))引起的非连续位置的总和。 如果这是真的操作速度较慢的原因,那么你可以重新定义你的矩阵有不同的顺序维度,使目前的第三维是第一。 是的,如果这是你的主要计算,重新排列矩阵,以使求和一列操作。 显式循环应尽可能早指数最快,由@PaulR描述。 如果您以前曾认为最佳的指标顺序的C和正在改变的Fortran,这可能需要改变的一个方面。 不过,虽然这在理论上是正确的,我怀疑它真正重要的是多在实践中,除非也许数组是巨大的。 (更糟的情况是阵列的一部分是在磁盘上的交换内存和一部分!)有关运行时的速度问题的第一条规则就是不要猜...措施。 它通常是算法。