从我在超级计算类中学到的知识中,我知道MPI是一个通信(和数据传递)接口。
我对您何时在C++程序中运行函数并希望每个处理器执行特定任务感到困惑。
例如,素数搜索(在超级计算机中非常流行)。假设我有一个值范围(531-564,一些任意范围),如果我有50个进程,我可以对每个数字运行一系列的评估。如果根(进程0)想检查531并知道素数,我可以使用8个进程(1-8)来计算素数状态。如果这个数字可以被任何一个余数为0的2-9整除,那么它就不是素数。
对于传递数据给每个进程的MPI来说,是否有可能让这些进程执行这些操作?
对我来说最困难的部分是理解,如果我在原始的C++程序中执行一个操作,所发生的进程可以在几个不同的进程上分配,那么在MPI中,我如何构造这个过程呢?还是我的理解完全错了?如果是这样的话,我应该怎样才能真正正确地走这条思路呢?
大的想法是将数据传递给进程,而不是将函数发送到进程。我很肯定我错了,但我正在努力纠正我的想法。
发布于 2016-11-18 05:11:43
每个MPI进程都在运行相同的程序,但这并不意味着它们在做相同的事情。不同的进程可以运行不同的代码分支,这取决于进程的id (或“秩”),实际上是完全独立的。与任何分布式计算一样,参与者需要就如何进行通信达成一致。
MPI中最基本的策略是分散--收集,其中“主”进程(通常是0级的进程)通过让所有节点调用分散来将一组工作平均地分配给对等方(包括主进程本身),然后所有的对等点将聚集起来将结果发送回主进程。
在您的主要算法示例中,构建一个整数数组,将其“分散”到所有对等点,每个对等点将运行其数组,如果它是素数,则保存1;如果不是,则保存0,然后将结果“收集”到主。在这个特殊的例子中,由于输入数据是完全可预测的,基于进程等级,分散步骤是不必要的,但我们无论如何都会这么做。
作为伪码:
main():
int x[n], n = 100
MPI_init()
// prepare data on master
if rank == 0:
for i in 1 ... n, x[i] = i
// send data from x on root to local on each process in world
MPI_scatter(x, n, int, local, n/k, int, root, world)
for i in 1 ... n/k
result[i] = 1 // assume prime
if 2 divides local[i], result[i] = 0
if 3 divides local[i], result[i] = 0
if 5 divides local[i], result[i] = 0
if 7 divides local[i], result[i] = 0
// gather reults from local on each process in world to x on root
MPI_gather(result, n/k, int, x, n, int, root, world)
// print results
if rank == 0:
for i in 1 ... n, print i if x[i] == 1
MPI_finalize()有许多细节需要填写,比如正确的声明,以及使用正确的C语法等处理某些级别的元素比其他级别少的事实,但是正确的处理并不能帮助解释总体情况。
更细粒度的同步和通信可以使用进程之间的直接发送/恢复。这样的程序很难编写,因为不同的进程可能处于不同的状态。特别重要的是,如果进程a调用MPI_send来处理b,那么进程b最好是从a调用MPI_recv。
https://stackoverflow.com/questions/40666167
复制相似问题