Matrix Fortran 90中避免分段错误的最大矩阵大小
Fortran 90代码中NxN矩阵中N的最大值是多少,这样就不会出现分段错误 例如,当我使用大小为2^8 x 2^8的矩阵并使用它们进行乘法(使用内在的“matmul”函数)时,我没有任何问题Matrix Fortran 90中避免分段错误的最大矩阵大小,matrix,fortran,fortran90,Matrix,Fortran,Fortran90,Fortran 90代码中NxN矩阵中N的最大值是多少,这样就不会出现分段错误 例如,当我使用大小为2^8 x 2^8的矩阵并使用它们进行乘法(使用内在的“matmul”函数)时,我没有任何问题 然而,当我使用2×12×2×12矩阵时,没有发现任何编译错误,但是在程序中间有分割错误。 我是否正在耗尽内存分配,或者代码中可能存在错误 我使用了动态分配,并且使用了64位RedHat OS和64 GB RAM 最大大小是否取决于编译器或系统配置 (2) 最大可分配大小取决于主内存,而数组构造函数(
然而,当我使用2×12×2×12矩阵时,没有发现任何编译错误,但是在程序中间有分割错误。 我是否正在耗尽内存分配,或者代码中可能存在错误
我使用了动态分配,并且使用了64位RedHat OS和64 GB RAM-fmax array constructor=n
设置,请参阅
(1) 这很容易计算:
双精度复杂变量为16字节。因此,如果您有一个nxn
矩阵和64GB的RAM,这将导致N=\sqrt(64GB/16B)\N大约63245
因此,对于双精度复数值,您受到主内存的限制
Real
s(通常)单精度为4字节,双精度为8字节。单精度复杂变量使用8字节 Fortran编译器通常在堆栈上分配可分配的数组;或者可能在堆上。关于这一点我不确定,但我确信Fortran标准并没有规定可分配数组的放置位置。编译器文档将告诉您默认情况下可分配数组的位置。您可能会发现,您看到的错误可以通过移动分配轨迹或扩展(由操作系统决定的)堆栈或堆大小来避免
您还可以对任何allocate
语句使用stat
可选参数,并在程序中捕获分配失败。当然,您仍然无法获得分配的数组,但这将避免程序崩溃
您还应该遵循@Alexander答案中的建议,计算您试图分配的数组的大小,摆弄堆和堆栈大小不会为您提供超过可用RAM的空间。您应该尝试使用
ulimit -s unlimited
我也遇到过类似的问题,因为
ifort
在堆栈上为matrixoperations创建了大型临时数组,这可能会导致意外的SEGFULT。根据我的经验,一旦使用大型数组,您就需要告诉ifort
在堆上使用-heap arrays
分配数组。我在gfortran
和大型数组方面从未遇到过任何问题。您支持我的观点之一:OP需要阅读他/她的编译器的文档。您是否对可分配数组和自动数组感到困惑?将可分配数组放在堆栈上的编译器将是罕见的野兽。我甚至不确定用这种方式实现它们在技术上是否可行(特别是在F2003上)。@IanH:嗯,可能吧,但我的目的并不仅仅是要暴露我的无知。我打算对编译器用来实现语言特性(就像Fortran标准一样)的机制不置可否,并促使OP阅读他/她的编译器的文档。如果我断言可分配数组被放置在堆栈上,有人会带着一个反例或一个关于我所说的堆栈的确切含义的问题游移不定。如果你想重写我的答案,以增加准确性和提高所有基的覆盖率,那就直接写吧。在堆栈上实现可分配数组是完全可能的。这就是标准C库中alloca(3)的用途(注意:不是POSIX调用)。从技术角度看,这是好是坏是完全不同的。只是一个旁注:对于这么大的矩阵,您可能最好使用LAPACK例程而不是matmul。这是真的,但会给应用程序的用户带来负担(即使这只意味着对您而言)。我更喜欢设置-heap数组l
,其中l
是一些限制大小。我使用-heap数组200
。这样,大于200 kB的数组就被放置在堆上。