MPI新手 - 关于'mpirun'如何工作及进程管理的一些问题

4 投票
1 回答
1740 浏览
提问于 2025-04-17 20:48

首先,我不是专业程序员,但我需要为我的项目编写代码(我对C++和Python有一些了解)。我经常来这里寻找解决方案,通常能找到不错的答案,但现在我对MPI编程有一些基本问题,如果不弄清楚这些概念,我就无法继续进行。

以下是我遇到的问题描述:

我想为一个科学计算的算法编写代码。这个代码可以分为两个部分。

A.) 矩阵与向量的乘法和矩阵的求逆。这部分相对简单,我甚至已经有了自己能用的MPI代码。

B.) 调用一个外部的MPI程序进行更复杂的计算(这一部分也应该简单,因为只是调用一个UNIX命令行)。

我现在的问题是,如何将这两部分结合在一起?我的算法是这样的:

for k in specified range
   dividing a state vector of size 6NMx1 into M blocks, let each of M nodes handle these.
   Manipulate a state vector of size 6NMx1 according to A.) in parallel
   After A.) is done, run B.) using M nodes in parallel /* THIS IS WHERE I GOT STUCK */
   Update state vector
end for

要运行B.),我需要使用mpirun来调用一个UNIX命令,

mpirun -np #PPN my_app > some_output

我有以下几个问题:

  1. ‘mpirun’到底是怎么工作的?它在调用时会生成新的进程吗?

  2. 假设我使用M个计算节点,每个节点有16个处理器,如果我只用一个节点的一个进程来调用上面的UNIX命令,会生成16个新的进程吗?如果是这样的话,我总共会有256M个进程在运行,对吗?

  3. 我的主要目标是让每个计算节点处理系统向量中的一个块(这些块是独立的,大小为6Nx1),并将每个块中的数字作为B.)的输入。我在使用集群,所以当我提交作业时,必须提前定义节点的数量,我希望每个节点在完成A.)后也能并行运行B.)。有没有什么建议可以用MPI来实现这个?有人告诉我要分别为A.)和B.)编写代码,然后用一个Python脚本在上层控制它们,应该看起来像这样……

Python脚本:

for k in specified range
   mpirun A.) --> This is straightforward for me
   mpirun B.)
end for

B.)的伪代码

/* THIS PROGRAM SHOULD HAVE 16M PROCESSES */
if rank % 16 == 0
   mpirun -np 16 my_app > output
end if
/* I WANT M CALLS TO THIS PROGRAM IN PARALLEL */
MPI_COMM.BARRIER

你认为这个方案会在B.)中并行使用16M个进程吗?如果有比这个更好的实现B.)的方法,或者更好的是把它和A.)放在同一个代码中,请告诉我!

3.) 这是我的原型代码,所以我并不在乎效率。我只需要它能工作,优化的事情我会在后面再考虑。

如果我的描述让你感到困惑,请问我,我会回来澄清。谢谢你的时间,我非常感谢你的帮助! :)

1 个回答

2

mpirun 是一个命令,用来运行你在命令行中指定的工作任务数量。它会自动检测你的机器类型,并进行相应的操作。

回答第二个问题有点复杂,因为如果你在使用一个包含多个节点的集群,你可能需要使用专门的协议。比如,使用 slurm 的时候,你会通过 sbatch 协议来运行你的程序,像这样:

// number of proc on one node
#SBATCH -n 2
// number of node
#SBATCH -N 4

run ./a.out

这意味着你会在4个节点上运行你的程序,每个节点上有2个处理器。

接下来的内容我不是很确定,因为对我来说有点混乱,但也许你应该用其他方式重新考虑你的问题。如果你只是在一个节点内工作,就不需要用到 MPI,而应该使用 openMP。

如果你在处理非共享内存的情况,才需要用到 MPI,而在一个节点内就不是这种情况。

希望这些信息能对你的工作有所帮助。

撰写回答