首先,我不是专业的程序员,但我必须为我的项目编写代码(虽然我对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
我的问题是,
'mpirun'实际上如何运作?它是否在调用时产生新进程?
假设我正在使用M群集计算节点,并且每个节点每个节点有16个处理器,如果我只使用该节点的1个进程来调用上述UNIX命令,它是否会再生成16个进程?如果是这样,我最终会运行256M进程,我是否正确?
我的主要目标是使用每个计算节点处理系统向量中的块(块是独立的,大小为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
你认为这个方案将并行使用16M进程吗?)?如果有更好的方法来实现B.),或者甚至更好,将它包装在与A相同的代码中,请建议我!
3。)这是我的原型代码,所以我并不关心效率。我只是需要它才能工作,我稍后会关注优化。
如果我的描述令人困惑,请问我,我会回来澄清。感谢您的时间,我非常感谢您的帮助! :)
答案 0 :(得分:2)
Mpirun只是一个命令,可以运行您在选项命令行中所需的作业数量,它可能会检测您拥有和使用的机器类型。
回答第二个问题很复杂,因为如果您使用的是具有多个节点的群集,则应该使用专用协议。例如,使用slurm,您可以通过sbatch协议运行程序,例如:
// number of proc on one node
#SBATCH -n 2
// number of node
#SBATCH -N 4
run ./a.out
这意味着您将在4个节点上运行程序,每个节点上有2个proc。
我真的不知道以下因为这对我来说有点迷惑,但也许你应该用别的东西重新考虑你的问题。如果您在节点内工作,则不需要MPI,但应使用openMP。
如果您使用的是非共享内存,则需要使用MPI,而不是这种情况。
我希望它能帮助你完成工作。