我是一名研究生(硕士),并使用内部代码来运行使用 MPI 的模拟。早些时候,我在我们曾经访问过的超级计算机上使用了 OpenMPI,自从它关闭后,我一直在尝试切换到另一台安装了 Intel MPI 的超级计算机。问题是,之前运行良好的相同代码现在在一定数量的迭代(时间步长)后会出现内存泄漏。由于代码比较大,而且我对 MPI 的了解非常基础,因此调试起来非常困难。所以我将 OpenMPI 安装到我正在使用的这台新超级计算机上,但它在执行时给出以下错误消息,然后终止:
PE 数量无效 请检查分区模式或 PE 数量
注意:对于我用来运行案例的多个节点(这里是 8 个)重复错误消息。使用带有 -fopenmp 的 mpif90 编译,用于线程并行化。
事实上,不能保证在 OpenMPI 上运行它不会导致内存泄漏,但我觉得值得一试,因为它之前运行得非常好。
PS:在英特尔 MPI 上,这是我得到的错误(使用带有 -qopenmp 的 mpiifort 编译)
节点 16 上的中止(941211497)(comm 0 中的第 16 位):PMPI_Isend 中的致命错误:>未知错误类别,错误堆栈:PMPI_Isend(152)............:MPI_Isend(buf=0x2aba1cbc8060, count=4900, dtype=0x4c000829, dest=20, tag=0, MPI_COMM_WORLD, request=0x7ffec8586e5c) MPID_Isend(662).......: MPID_isend_unsafe(282)....: MPIDI_OFI_send_normal( 305): 为节点 17 上的请求对象 Abort(203013993) 分配内存时发生故障(comm 0 中的排名 17):PMPI_Isend 中的致命错误:>未知错误类,错误堆栈:PMPI_Isend(152)...... .....: MPI_Isend(buf=0x2b38c479c060, count=4900, dtype=0x4c000829, dest=21, tag=0, MPI_COMM_WORLD, request=0x7fffc20097dc) 失败 MPID_Isend(662)............ : MPID_isend_unsafe(282)....: MPIDI_OFI_send_normal(305):为请求对象 [mpiexec@cx0321.obcx] HYD_sock_write (../../../../../src/pm/i_hydra/libhydra/sock/hydra_sock_intel.c:357) 分配内存时发生故障:写入错误(错误的文件描述符)[mpiexec@cx0321.obcx] cmd_bcast_root (../../../../../src/pm/i_hydra/mpiexec/mpiexec.c:164):发送 cmd 15 时出错代理 [mpiexec@cx0321.obcx] send_abort_rank_downstream (../../../../../src/pm/i_hydra/mpiexec/intel/i_mpiexec.c:557):无法向下游发送响应 [mpiexec @cx0321.obcx] control_cb (../../../../../src/pm/i_hydra/mpiexec/mpiexec.c:1576): 无法向下游发送中止等级 [mpiexec@cx0321.obcx ] HYDI_dmx_poll_wait_for_event (../../../../../src/pm/i_hydra/libhydra/demux/hydra_demux_poll.c:79): 回调返回错误状态 [mpiexec@cx0321.obcx] main (.. /../../../../src/pm/i_hydra/mpiexec/mpiexec.c:1962):错误等待事件”
如果有人愿意看一下,我很乐意提供代码。它是使用 Fortran 编写的,其中一些函数是用 C 编写的。由于这个问题,我的研究进展已经完全停止,我实验室中没有人有足够的 MPI 经验来解决这个问题。