繁体   English   中英

mpi4py:关闭MPI Spawn?

[英]mpi4py: close MPI 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()命令,但在完成后它们仍保持“打开”状态。 如何正确“关闭”衍生过程?

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

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

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

user@host$ ulimit -n 123456
user@host$ mpiexec -n 1 ... ./spawning_code.py arg1 arg2 ...

这里123456是描述符数量的期望限制,它不能超过ulimit -nH可以获得的硬限制。 如果您是从脚本运行程序(为方便起见或因为您将作业提交到某个批处理排队系统),则应在调用mpirun / mpiexec之前将ulimit -n行放在脚本中。

同样在上面的文本中,单词rankprocess用于指代相同的事物。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM