【发布时间】:2012-06-21 16:41:24
【问题描述】:
我正在努力优化用 Fortran 编写的流体流动和传热分析程序。当我尝试运行越来越大的网格模拟时,我遇到了内存限制问题。不过,网格并不是那么大。运行典型的 CFD 代码只需 500,000 个单元和小花生。即使我为我的问题请求 80 GB 内存,它也会由于虚拟内存不足而崩溃。
我对哪些数组占用了所有内存有一些猜测。特别是分配给(28801,345600)。如果我的计算有误,请纠正我,但双精度数组是每个值 8 位。那么这个数组的大小会是 28801*345600*8=79.6 GB?
现在,我认为这个数组的大部分最终在整个计算过程中都是零,所以我们不需要存储它们。我想我可以将解决方案算法更改为仅将非零值存储在一个更小的数组中。但是,我想确定我正在查看正确的数组以减小大小。那么首先,我是否正确计算了上面的数组大小?其次,有没有办法让 Fortran 在运行时以 MB 或 GB 为单位显示数组大小?除了打印出内存最密集的数组之外,我还想看看代码的内存需求在运行时是如何变化的。
【问题讨论】:
-
运行它的机器上有多少实际内存?另外,你的假设是错误的 double 精度是 8 个字节,而不是 8 位。这产生了大约 74.16 GB 的数据(1024 的幂,而不是 1000)。另外,我是否正确假设您正在处理 4 天的数据(345600 秒 = 60 * 60 * 24 * 4)
-
Mike,这是在集群上运行的,我可以请求每个节点最多 96 GB 的内存。对字节与位的混淆感到抱歉,感谢您清除它,但我在正确的球场上,所以数组大小绝对是一个问题。不,那个 345600 和模型网格中的单元格数量有关,与时间无关。
-
@user104629:一个原因可能是它无法分配一个连续的 80 GB 内存数组。
-
在我看来,如果您需要在具有 0.5 个 Mcell 的 CFD 模型中使用如此大的阵列,那就大错特错了。
-
当然可以。正如我所怀疑的那样,问题在于非零条目存储在压力系数矩阵中。 TotalView 显示此阵列消耗 80 GB。我通过使用压缩存储格式解决了这个问题。 TotalView 还揭示了另外两个非常大的数组,它们每个都占用 10 GB 的空间,并且在代码中根本没有做任何事情。消除这些问题后,我的内存使用量从 100 GB 以上减少到了 2.5 GB。