Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance fortran矩阵运算的性能_Performance_Caching_Matrix_Fortran - Fatal编程技术网

Performance fortran矩阵运算的性能

Performance fortran矩阵运算的性能,performance,caching,matrix,fortran,Performance,Caching,Matrix,Fortran,我需要在某个地方使用Fortran而不是C语言,我对Fortran非常陌生。我试图做一些大的计算,但它是相当缓慢的比较C也许10倍或更多,我使用英特尔的编译器为这两个。我认为原因是Fortran将矩阵保持为列主格式,我正在尝试执行summatrixi,j,:,之类的操作,因为它是列主格式,可能这会非常低效地使用缓存,可能根本不使用。然而,我不确定这是否是真正的原因,因为我对Fortran所知甚少。问题是,Fortran中的惯例是对列向量而不是行向量执行操作 顺便说一句:我已经用英特尔的LAPAC

我需要在某个地方使用Fortran而不是C语言,我对Fortran非常陌生。我试图做一些大的计算,但它是相当缓慢的比较C也许10倍或更多,我使用英特尔的编译器为这两个。我认为原因是Fortran将矩阵保持为列主格式,我正在尝试执行summatrixi,j,:,之类的操作,因为它是列主格式,可能这会非常低效地使用缓存,可能根本不使用。然而,我不确定这是否是真正的原因,因为我对Fortran所知甚少。问题是,Fortran中的惯例是对列向量而不是行向量执行操作

顺便说一句:我已经用英特尔的LAPACK库检查了Fortran的速度,它相当快,因此与任何编译器或编译问题无关

谢谢


Mete

在执行矩阵运算时,尝试更改循环的顺序,例如,如果在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列循环作为外部循环,i行循环作为内部循环


另一种实现相同目的的方法是保持循环不变,但更改数组的定义,例如,如果在C中是A[x][y][z][t],那么在FORTRAN中,假设t是变化最快的循环索引,x是最慢的循环索引,则将其设为A[t][z][y][x],Fortran是列主语言,第一个索引在内存布局中变化最快,因此summatrixi,j,:导致非连续位置的求和。如果这确实是操作较慢的原因,则可以重新定义矩阵,使其具有不同的维度顺序,以便当前的第三维是第一维。是的,如果这是您的主要计算,请重新排列矩阵,使求和成为列操作。显式循环应该像@PaulR所描述的那样最快。如果您以前考虑过C的最佳索引顺序,并且正在更改为Fortran,那么这是可能需要更改的一个方面。但尽管这在理论上是正确的,但我怀疑这在实践中是否真的那么重要,除非阵列规模巨大。更糟糕的情况是,阵列的一部分在RAM中,另一部分在磁盘上交换!关于运行时速度问题的第一条规则是不要猜测。。。测量这通常是算法。

FORTRAN在矩阵运算方面通常比C快,所以我猜问题出在您的代码中;x、 y,z,t。我需要每个空间位置的t向量。所以我认为我不能轻易改变循环,我不认为我可以这样计算。有没有一种简单的方法可以把它转换成t,x,y,z格式?我是说一种Fortran特有的更简单的方法。对不起,如果我说的是废话,我真的不习惯用Fortran的方式思考。我不知道enermous是什么意思,但它肯定不适合轻松缓存大约2^24倍,我以前在C中也经历过同样的情况。算法很简单,在时空数据中,我为每个空间位置的每对数据样本计算pearson相关系数。这不是要将整个数据结构拟合到缓存中,而是要确保一旦从主存拉入缓存线,就可以快速连续地使用许多值。