rks*_*171 8 fortran memory-management
我正在努力优化用Fortran编写的流体流动和传热分析程序.当我尝试运行越来越大的网格模拟时,我遇到了内存限制问题.但是,网格并不是那么大.只有500,000个单元和小花生才能运行典型的CFD代码.即使我为我的问题请求80 GB的内存,它也会因虚拟内存不足而崩溃.
我猜测阵列正在占用所有内存.特别是一个被分配给(28801,345600).如果我在计算中错了,请纠正我,但双精度数组是每个值8位.那么这个数组的大小是28801*345600*8 = 79.6 GB?
现在,我认为大多数这个数组在整个计算过程中最终都是零,所以我们不需要存储它们.我想我可以改变解决方案算法,只存储非零值,以便在更小的数组中工作.但是,我想确定我正在查看正确的数组以减小尺寸.首先,我是否正确计算了上面的数组大小?第二,有没有办法让Fortran在运行时显示MB或GB的数组大小?除了打印出大多数内存密集型数组外,我还有兴趣了解代码的内存需求在运行时是如何变化的.
在具有虚拟内存的系统上,内存使用是一个定义相当模糊的概念。您可以分配大量内存(大虚拟内存大小),但实际上只有一小部分被主动使用(小驻留集大小- RSS)。
Unix 系统提供的getrusage(2)系统调用返回有关调用线程/进程/子进程所使用的系统资源量的信息。特别是,它提供了自进程启动以来所达到的 RSS 的最大值。您可以编写一个简单的 Fortran 可调用辅助 C 函数,该函数将调用并返回结构体字段getrusage(2)的值。ru_maxrssrusage
如果您在 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
...
Run Code Online (Sandbox Code Playgroud)
各个字段的解释 -这里。您最感兴趣的是VmData、VmRSS、VmHWM和VmSize。您可以将/proc/self/status其作为常规文件打开,OPEN()并完全在 Fortran 代码中对其进行处理。
另请参阅使用ulimit -a和设置哪些内存限制ulimit -aH。您可能超出了硬虚拟内存大小限制。如果您通过分布式资源管理器(例如 SGE/OGE、Torque/PBS、LSF 等)提交作业,请检查您是否为作业请求了足够的内存。
| 归档时间: |
|
| 查看次数: |
8693 次 |
| 最近记录: |