【发布时间】: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
我的问题是,
“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
你认为这个方案会为 B.) 并行使用 16M 进程吗?如果有比这更好的实现 B.) 的方法,或者甚至更好的方法,将其包装在与 A.) 相同的代码中,请建议我!
3.) 这是我的原型代码,所以我并不关心效率。我只需要它工作,稍后我会关心优化。
如果我的描述令人困惑,请询问我,我会回来澄清。感谢您的宝贵时间,我非常感谢您的帮助! :)
【问题讨论】: