如何使用OpenMPI 5.0.9的mpirun进行高效并行计算?

摘要:1. 前言 mpirun 是 openmpi 的命令行工具,它提供了一种简单的方式来并行启动应用程序,但是必须依赖 openmpi 环境。它允许在多个节点上同时启动多个并行应用程序,每个应用程序都是以进程的方式运行,而不是线程。另外,mpi
1. 前言 mpirun 是 openmpi 的命令行工具,它提供了一种简单的方式来并行启动应用程序,但是必须依赖 openmpi 环境。它允许在多个节点上同时启动多个并行应用程序,每个应用程序都是以进程的方式运行,而不是线程。另外,mpirun 和 mpiexec 是同一个工具,用法相同。 2. 语法 一个应用程序 mpirun [mpirun参数] [应用程序] 多个应用程序 mpirun [mpirun全局参数] [mpirun局部参数] [应用程序1] : [mpirun局部参数] [应用程序2] : [mpirun局部参数] [应用程序3] 其中[应用程序1]后面必须是空格 + :。 常见的用法 mpirun [ -n X ] [ --hostfile <filename> ] <program> 或者 mpirun [ --host hostname:X ] [ --map-by ppr:X:node ] <program> 上述X表示进程数,即启动多少个进程。 3. 参数 下面将以一个完整例子对 mpirun 的相关参数进行解释: mpirun \ --allow-run-as-root \ -x LD_PRELOAD=/usr/lib64/libpil4dfs.so \ --host nodeb:32 \ --bind-to hwthread \ --map-by ppr:32:node \ ior --dataPacketType=timestamp -C -Q 1 -g -G=695406083 -F -k -e -o /mnt/testfs/test -t 4k -b 4k -s 262144 -w -D 300 -T 120 -a POSIX 上述采用指定 host 的方式而不是 hostfile 的方式,用 mpirun 在 nodeb 节点上启动 32 个进程,每个进程都运行一个 ior 程序。以下是参数解释: --allow-run-as-root:允许以 root 用户身份运行 mpirun。 -x LD_PRELOAD=/usr/lib64/libpil4dfs.so:设置环境变量 LD_PRELOAD 的值为/usr/lib64/libpil4dfs.so。 --host nodeb:32:指定运行节点为 nodeb,进程数为 32。 --bind-to hwthread:将进程绑定到硬件线程上。默认是bind-to core:与 core 进行绑定。当应用程序中启动了多线程,需要指定--bind-to none。 --map-by ppr:32:node:将进程分布到节点上,每个节点上运行 32 个进程。默认是map-by core:按节点先后顺序以轮询的方式分布到 core 上。当第一个节点的 core 的 slots 数量不够时,会自动将进程分布到下一个节点上。 其中要着重说明--host和--hostfile在使用上的区别: 当使用--host参数指定 mpirun 要在哪些节点上启动应用程序时,一定要按照--host hostname1:X,hostname2:X...的格式来指定,其中X表示每个节点上总的 slots 数量。当要指定每个节点实际要启动的进程数量时,要使用--map-by ppr:Y:node方式。其中X和Y的关系是:Y <= X。 当使用--hostfile参数指定 mpirun 要在哪些节点上启动应用程序时,需要创建一个 hostfile 文件,文件内容按照hostname slots=X的格式来指定。其中slots表示每个节点上总的 slots 数量。当要指定每个节点实际要启动的进程数量时,可以使用-n Y方式。其中X和Y的关系是:Y <= X。(官方文档说 -n Y这种方式已经被抛弃了,推荐使用--map-by ppr:Y:node的方式)。 4. 实例 在 3 个节点上分别并行启动 32 个 ior 进程。
阅读全文