Memory leaks 节点的MPI Fortran内存混淆了吗?

Memory leaks 节点的MPI Fortran内存混淆了吗?,memory-leaks,fortran,mpi,intel-fortran,Memory Leaks,Fortran,Mpi,Intel Fortran,我目前正在并行化(使用MPICH)一个现有的旧FORTRAN程序(它只对图像的一个像素执行一些数据反转-->需要并行化)。我的策略是编写一个新的主例程,它执行所有I/O,将信息(一个像素)传递给每个节点,并调用现有程序(我将其转换为子例程)。节点彼此独立地进行计算,并将结果传递回主例程 在集群上运行之后,我发现了一些奇怪的问题:在一些节点上,计算没有很好地完成,因为在某些点上,NaN值出现在一些变量上(在使用顺序版本时不会出现)。在第一个像素发生这种情况后(或多或少是随机的,但取决于我运行它的计

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

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

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

我的一般问题是:是否有可能节点的内存被s.th搞混了。NaN出现在记忆中奇怪的地方(但这不能解释周期性行为)?或者还有什么可能导致内存泄漏(我可以排除数字)?我的根节点确实分配了巨大的阵列(总共约2GB),但在集群上,我每个节点有128GB的可用RAM,而从节点使用的内存要少得多

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

有什么建议吗? 干杯,stefan谢谢你的帮助。 使用-fpe=0跟踪NAN使我找到了正确的方向,问题与浮点精度有关: 我总是使用
-fp model precision-fp model source
,相信这会给我最高的精度。事实证明,使用
-fltconsistency
解决了我所有的问题


没有更多的错误。

我忘了提一下:旧代码使用许多公共块在子例程之间进行数据交换。我没有发现MPI中如何处理公共块的任何提示。理论上,因为每个节点都在调用自己的旧代码实例,所以公共块的作用域应该限制在每个节点上。有人能证实这一点吗?那可能是任何事情。您确定要使用
运行吗?检查所有
?我建议您使用并行调试器,例如TotalView或Allinea DDT,如果您在群集中安装了其中一个调试器。这些允许在MPI应用程序中设置全局断点,并检查所有列组中的变量值。MPI进程不共享它们的内存空间,因此内存混乱几乎是不可能的。感谢您的提示:使用调试选项(包括全选)编译会给我带来错误,因为旧代码中存在隐式定义(是的,我知道使用隐式是不好的,我永远不会在我自己的代码中使用它,而是在现有代码中使用它(~20个文件)它正在被使用,我不想深入研究所有内容并定义变量;除此之外:旧代码是按顺序工作的,因此隐式定义不应该是问题)。使用-check all-check nouninit时,我没有收到任何特殊警告群集上没有安装并行调试器,我在PC上尝试了DDT,但它与MPICh 3.0.4不兼容
-heap_arrays -O2 -save -w -fp-model precise -fp-model source -mcmodel=medium -extend_source -shared-intel