fortran 90中矩阵的最大大小避免了分段错误

时间:2013-09-30 11:53:36

标签: matrix fortran fortran90

1)fortran 90代码中NxN矩阵中N的最大值是多少,以便不发生分段错误?

例如,当我使用大小为2 ^ 8 x 2 ^ 8的矩阵并将它们用于乘法(使用内在的'matmul'函数)时,我没有任何问题。

然而,当我使用2 ^ 12 x 2 ^ 12矩阵时,我没有发现任何编译错误,但是我在程序中间出现了分段错误。

我是否耗尽了内存分配,或者我的代码中可能存在错误?

我使用了动态分配,我使用64位RedHat OS和64 GB RAM。

2)最大大小还取决于编译器还是系统配置?

提前致谢。

[除非确实需要回答,否则请不要让我粘贴。我相信我的问题很笼统。]

3 个答案:

答案 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会在堆栈上为矩阵操作创建大型临时数组,这可能会导致意外的段错误。