Fortran阵列内存管理

时间:2012-06-21 16:41:25

标签: memory-management fortran

我正在努力优化用Fortran编写的流体流动和传热分析程序。当我尝试运行越来越大的网格模拟时,我遇到了内存限制问题。但是,网格并不是那么大。只有500,000个单元和小花生才能运行典型的CFD代码。即使我为我的问题请求80 GB的内存,它也会因虚拟内存不足而崩溃。

我猜测阵列正在占用所有内存。特别是一个被分配给(28801,345600)。如果我在计算中错了,请纠正我,但双精度数组是每个值8位。那么这个数组的大小是28801 * 345600 * 8 = 79.6 GB?

现在,我认为大多数这个数组在整个计算过程中最终都是零,所以我们不需要存储它们。我想我可以改变解决方案算法,只存储非零值,以便在更小的数组中工作。但是,我想确定我正在查看正确的数组以减小尺寸。首先,我是否正确计算了上面的数组大小?第二,有没有办法让Fortran在运行时显示MB或GB的数组大小?除了打印出大多数内存密集型数组外,我还有兴趣了解代码的内存需求在运行时是如何变化的。

1 个答案:

答案 0 :(得分:4)

在具有虚拟内存的系统上,内存使用是一个非常模糊的概念。您可以分配大量内存(大虚拟内存大小),但实际上只有一小部分内存被主动使用(小常驻集大小 - RSS)。

Unix系统提供getrusage(2)系统调用,该调用返回有关调用线程/进程/进程子级使用的系统资源量的信息。特别是它提供了自进程启动以来所达到的RSS的最大值。您可以编写一个简单的Fortran可调用辅助C函数,该函数将调用getrusage(2)并返回ru_maxrss结构的rusage字段的值。

如果您在Linux上运行而不关心可移植性,那么您可以打开并阅读/proc/self/status。它是一个简单的文本伪文件,其中包含几行,其中包含有关进程虚拟内存使用情况的统计信息:

...
VmPeak:     9136 kB
VmSize:     7896 kB
VmLck:         0 kB
VmHWM:      7572 kB
VmRSS:      6316 kB
VmData:     5224 kB
VmStk:        88 kB
VmExe:       572 kB
VmLib:      1708 kB
VmPTE:        20 kB
...

各个字段的说明 - here。您最感兴趣的是VmDataVmRSSVmHWMVmSize。您可以将/proc/self/status打开为OPEN()的常规文件,并在Fortran代码中完全处理。

另请参阅ulimit -aulimit -aH设置的内存限制。您可能超出了硬虚拟内存大小限制。如果您通过分布式资源管理器(例如SGE / OGE,Torque / PBS,LSF等)提交作业,请检查您是否为该作业请求了足够的内存。