MPI新手 - 关于'mpirun'如何运作和流程管理的一些问题

时间:2014-03-04 16:31:49

标签: python c++ algorithm mpi

首先,我不是专业的程序员,但我必须为我的项目编写代码(虽然我对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个处理器,如果我只使用该节点的1个进程来调用上述UNIX命令,它是否会再生成16个进程?如果是这样,我最终会运行256M进程,我是否正确?

  3. 我的主要目标是使用每个计算节点处理系统向量中的块(块是独立的,大小为6Nx1),并将使用每个块中的数字作为B的输入。)我正在工作对于集群,所以当我提交我的工作时,我必须预先定义节点数,并且我严格地希望每个节点也在A.)完成后并行运行B.)。有关如何使用MPI进行此操作的建议吗?有些人告诉我分别为A.)和B.)编写代码,并使用python脚本在顶层控制它们,所以看起来应该是......

  4. 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。)这是我的原型代码,所以我并不关心效率。我只是需要它才能工作,我稍后会关注优化。

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

1 个答案:

答案 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,而不是这种情况。

我希望它能帮助你完成工作。