8

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

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

现在,我认为这个数组的大部分最终在整个计算过程中都是零,所以我们不需要存储它们。我想我可以将解决方案算法更改为仅将非零值存储在一个更小的数组中。但是,我想确定我正在查看正确的数组以减小大小。那么首先,我是否正确计算了上面的数组大小?其次,有没有办法让 Fortran 在运行时以 MB 或 GB 为单位显示数组大小?除了打印出内存最密集的数组之外,我还想看看代码的内存需求在运行时是如何变化的。

4

1 回答 1

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
...

各个领域的解释 -这里。您最感兴趣的是VmDataVmRSS和。您可以使用以下命令作为常规文件打开VmHWMVmSize/proc/self/statusOPEN()打开并完全在 Fortran 代码中进行处理。

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

于 2012-06-21T18:04:16.003 回答