1)fortran 90代码中NxN矩阵中N的最大值是多少,以便不发生分段错误?
例如,当我使用大小为2 ^ 8 x 2 ^ 8的矩阵并将它们用于乘法(使用内在的'matmul'函数)时,我没有任何问题。
然而,当我使用2 ^ 12 x 2 ^ 12矩阵时,我没有发现任何编译错误,但是我在程序中间出现了分段错误。
我是否耗尽了内存分配,或者我的代码中可能存在错误?
我使用了动态分配,我使用64位RedHat OS和64 GB RAM。
2)最大大小还取决于编译器还是系统配置?
提前致谢。
[除非确实需要回答,否则请不要让我粘贴。我相信我的问题很笼统。]
答案 0 :(得分:4)
(2)最大可分配大小取决于您的主内存,以及数组构造函数的最大大小(对于gfortran),默认情况下为65535,可以由-fmax-array-constructor=n
设置,请参阅here 。
(1)这很容易计算:
双精度复数变量为16 Byte。因此,如果您有一个N x N
矩阵和64GB的RAM,则会导致N = \sqrt ( 64 GB / 16 B ) \approx 63245
。
因此,对于双精度复数值,您受主存储器的限制。
对于单精度, Real
(通常)为4字节,双精度为8字节。单精度复杂变量使用8个字节。
答案 1 :(得分:4)
Fortran编译器通常在堆栈上分配可分配的数组;或者可能在堆上。其中我不确定,但我确信Fortran标准没有规定可放置可分配数组的位置。您的编译器文档将告诉您默认情况下放置可分配数组的位置。您可能会发现,通过移动分配轨迹或扩展(操作系统确定的)堆栈或堆大小,可以避免您看到的故障。
您也可以通过对任何stat
语句使用allocate
可选参数来帮助自己,并在程序中捕获分配失败。当然,您仍然不会分配数组,但这样可以避免程序崩溃。
您还应该遵循@Alex的答案中的建议并计算您要分配的数组的大小,摆弄堆和堆栈大小不会为您提供比RAM可用空间更多的空间。
答案 2 :(得分:2)
您应该尝试使用
将堆栈大小设置为无限制ulimit -s unlimited
我遇到了类似的问题,因为ifort
会在堆栈上为矩阵操作创建大型临时数组,这可能会导致意外的段错误。