mpi4py:关闭MPI Spawn?

时间:2013-12-20 07:49:09

标签: python mpi openmpi spawn

我有一些python代码,我经常生成多个进程。我收到一个错误:

ORTE_ERROR_LOG: The system limit on number of pipes a process can open was reached in file odls_default_module.c at line 809

我的代码大致看起来像这样

import mpi4py
comm = MPI.COMM_WORLD
...
icomm = MPI.COMM_SELF.Spawn(sys.executable,args=["front_process.py",str(rank)],maxprocs=no_fronts)
...
message = icomm.recv(source=MPI.ANY_SOURCE,tag=21)
...
icomm.Free()

经常调用Spawn命令,我认为尽管给出icomm.Free()命令,但在完成后它们仍保持“打开”状态。如何正确“关闭”衍生过程?

1 个答案:

答案 0 :(得分:1)

MPI_COMM_FREE的MPI规范声明“......只有在没有其他活动引用的情况下才会释放该对象。”您可以通过调用{{}来断开进程。 1}}在连接它们的所有内部通信器的两端。等效的mpi4py调用可能是MPI_COMM_DISCONNECT

您看到的错误可能来自icomm.Disconnect()(符号链接为orterunmpirun),而不是来自主排名。 mpiexec是启动所有MPI进程(初始进程和稍后生成的进程)然后将其标准输出重定向到其自己的标准输出,以便您可以查看每个级别的输出。当在本地主机上启动进程时,orterun使用简单的orterun / fork()机制作为exec()框架的一部分来生成新的排名并使用管道来检测成功启动和IO转发。启动检测管道仅在很短的时间内打开,但只要等级正在运行,IO转发管道就会保持打开状态。如果你有许多同时运行的排名,很多管道将保持打开状态,因此会显示错误消息。

错误消息有点误导,因为有两种“描述符太多”的情况,Open MPI不区分它们。第一种情况是达到硬内核限制但这通常是一个巨大的值。第二种情况是达到文件描述符数量的每进程限制。后者可以使用odls命令控制。您应该使用ulimit检查案例中的值,并最终增加它。例如:

ulimit -n

此处user@host$ ulimit -n 123456 user@host$ mpiexec -n 1 ... ./spawning_code.py arg1 arg2 ... 是描述符数量的理想限制,并且不能超过123456可以获得的硬限制。如果您是从脚本运行程序(为方便起见或因为您将作业提交到某个批处理排队系统),您应该在调用ulimit -nH / {{ulimit -n之前将mpirun行放在脚本中1}}。

同样在上面的文字中,单词 rank process 用于指代相同的事物。