OpenMPI MIMD模式下mpirun参数区分及-np配置疑问
结论先行
第二种写法是符合需求的正确配置,你的两个猜测均成立。
1. 全局参数与本地参数的划分规则
OpenMPI的mpirun参数划分逻辑非常明确:
- 所有写在第一个可执行程序之前、不属于任何程序段的参数都是全局参数,对所有启动的进程生效。你提到的
--map-by、--bind-to属于资源调度、进程绑定类的全局配置,确实应该放在最开头作为全局参数。 - 冒号
:是MIMD模式下不同程序段的分隔符,每个程序段内部、可执行程序之前的参数为该段的本地参数,仅对当前段启动的进程生效。
2. -np参数的正确用法
-np属于程序段的本地参数,需要给每个独立的程序段单独配置:
- 第一种写法是错误的:
-np 3写在第一个程序段前,意味着第一个程序段./main --file debug.log1会启动3个进程,这3个进程都会写入同一个debug.log1文件;后面两个程序段没有指定-np默认各启动1个进程,最终会启动5个进程,完全不符合需求。 - 第二种写法完全正确:每个程序段配置
-np 1,意味着每个段仅启动1个进程,每个进程接收独立的--file参数,刚好实现每个进程输出到专属日志文件的需求。
3. 扩展优化建议
如果需要启动的进程数量较多,手动写多个程序段效率太低,可以用Shell脚本动态拼接启动命令,示例逻辑如下:
cmd="mpirun --map-by node --bind-to none" for i in {0..9}; do cmd="$cmd : -np 1 ./main --file debug.log$i" done # 去掉开头多余的冒号后执行 eval ${cmd/ : /}
如果不需要将文件路径作为参数传入程序,仅需要将每个进程的标准输出/错误重定向到独立文件,可直接使用OpenMPI自带的输出重定向参数,无需修改程序也不需要用MIMD模式:
mpirun --map-by node --bind-to none -np 3 --output-filename debug.log ./main
执行后会自动生成debug.log.0、debug.log.1、debug.log.2三个文件,分别对应Rank 0-2的输出。
内容的提问来源于stack exchange,提问作者sam.11100
相关产品推荐
相关产品推荐

