【问题标题】:MPI Newbie - some questions on how 'mpirun' works and process managementMPI 新手 - 关于“mpirun”如何工作和流程管理的一些问题
【发布时间】:2014-04-06 07:39:34
【问题描述】:

首先,我不是专业的程序员,但我必须为我的项目编写代码(不过我对 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脚本在顶层控制,应该是这样的..

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

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

【问题讨论】:

    标签: python c++ algorithm mpi


    【解决方案1】:

    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。

    希望对你的工作有所帮助。

    【讨论】:

    • 感谢您的建议。是的,我的集群使用 SLURM 调度程序。这是否意味着我实际上必须在运行 .msub 文件中的程序时准确指定处理器和节点的数量?所以,真的,我需要写一个 .msub 文件而不是直接在第二个代码中引用我的程序吗?
    • 嘿。是的,如果您使用 SLURM,您只需要编写一个脚本来运行您的程序并指定您需要的 proc 和节点。但可能需要在代码中添加一些配置,具体取决于您运行程序的 proc 和节点数(如果它不是通用的)。这里有一些关于 SLURM 的信息,也许你能找到一些答案:
    猜你喜欢
    • 2011-06-05
    • 1970-01-01
    • 2021-06-10
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-26
    相关资源
    最近更新 更多