【问题标题】:MPI Fortran memory of nodes mixed up?节点的 MPI Fortran 内存混淆了?
【发布时间】:2014-01-06 12:24:34
【问题描述】:

我目前正在并行化(使用 MPICH)一个现有的旧 FORTRAN 程序(该程序仅对图像的一个像素执行一些数据反转 --> 需要并行化)。我的策略是编写一个新的主程序来执行所有 I/O,将信息(一个像素的)传递给每个节点,并调用现有程序(我将其转换为子程序)。节点相互独立地进行计算,并将结果传回主程序。

在我们的集群上运行它后,我发现了奇怪的问题:在某些节点上,计算没有很好地完成,因为在某些时候 NaN 值出现在某些变量上(当我使用顺序版本时不会出现这种情况)。在第一个像素发生这种情况之后(或多或少是随机的,但取决于我正在运行它的计算机并取决于编译器选项)这种行为会随着我正在使用的节点数量定期重复(因为它也发生在另一台计算机上它不是由损坏的 CPU 引起的)。

我正在使用 MPICH 3.0.4、ifort 11.1 和 12.05(我在两个版本中都尝试过)

-heap_arrays -O2 -save -w -fp-model precise -fp-model source -mcmodel=medium -extend_source -shared-intel

我的一般性问题:节点的内存是否有可能以某种方式混淆…… NaN 出现在内存中的奇怪位置(但这不能解释周期性行为)?或者还有什么可能导致内存泄漏(我可以排除数字)?我的根节点确实分配了巨大的数组(总共大约 2GB),但在集群上,每个节点我有 128GB 的​​ RAM 可用,而从节点使用的内存要少得多!

下一个问题:我无法正确调试程序:使用 idb 我只发现由于复杂的数字和旧例程中的大量循环而突然出现 NaN。 我也不能使用 valgrind,因为由于 this 错误,不可能将它与大型可执行文件一起使用(我的是 ~5MB)。 Intel inspxe 只是告诉我我有内存泄漏(在子例程定义的行中)。

有什么建议吗? 干杯,斯蒂芬

【问题讨论】:

  • 我忘了说:旧代码使用很多通用块来进行子程序之间的数据交换。我没有发现任何提示如何在 MPI 中处理常见块。理论上,因为每个节点都在调用自己的旧代码实例,所以公共块应该有自己的范围,仅限于每个节点。有人可以证实这一点吗?
  • 可以是任何东西。您确定要使用-check all 运行吗?
  • 我建议您使用并行调试器,例如TotalView 或 Allinea DDT,如果您在集群上安装了其中之一。这些允许在 MPI 应用程序中设置全局断点并检查所有等级的变量值。 MPI 进程不共享它们的内存空间,因此内存混淆几乎是不可能的。
  • 感谢您的提示:由于旧代码中的隐式定义,使用调试选项(包括检查所有)进行编译会给我带来错误(是的,我知道使用隐式不好,我永远不会使用它在我自己的代码中,但在现有代码(~20files)中,它正在被使用,我不想挖掘所有代码并定义变量;除此之外:旧代码是按顺序工作的,所以隐式定义应该不是问题)。使用 -check all -check nouninit 我没有收到任何特殊警告
  • 集群上没有安装并行调试器,我在我的PC上尝试了DDT但它与MPICh 3.0.4不兼容

标签: memory-leaks fortran mpi intel-fortran


【解决方案1】:

感谢您的帮助。 使用 -fpe=0 跟踪 NaN 使我朝着正确的方向前进,问题与浮点精度有关: 我一直使用-fp-model precise -fp-model source,相信这会给我最高的精度。原来使用-fltconsistency 反而解决了我所有的问题!

没有更多错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-09
    • 1970-01-01
    • 2015-11-04
    • 1970-01-01
    • 1970-01-01
    • 2013-08-10
    • 2011-12-20
    • 1970-01-01
    相关资源
    最近更新 更多