C ++函数和MPI编程

时间:2016-11-17 22:25:38

标签: mpi

根据我在超级计算类中学到的知识,我知道MPI是一个通信(和数据传递)接口。

当你在C ++程序中运行一个函数并希望每个处理器执行一个特定的任务时,我感到很困惑。

例如,素数搜索(非常受超级计算机欢迎)。假设我有一系列值(531-564,某些任意范围),并说我有50个进程,我可以对每个数字进行一系列评估。如果root(进程0)想要检查531并且知道素数,我可以使用8个进程(1-8)来评估主要状态。如果数字可以被任何数字2-9整除,余数为0,那么它就不是素数。

对于将数据传递到每个进程的MPI,是否有可能让这些进程执行这些操作?

对我来说最困难的部分是理解如果我在原始C ++程序中执行操作,可以在几个不同的进程上分配发生的进程,然后在MPI中如何构建它?或者我的理解完全错了?如果是这样,我怎么能真正以正确的方式走这条思路呢?

最大的想法是将数据传递给进程而不是将函数发送到进程。我相当肯定我错了,但我试图回过头去修正我的想法。

1 个答案:

答案 0 :(得分:2)

每个MPI进程都运行相同的程序,但这并不意味着它们正在执行相同的操作。不同的进程可以运行代码的不同分支,具体取决于进程的id(或“rank”),实际上是完全独立的。像任何分布式计算一样,参与者确实需要就他们如何沟通达成一致。

MPI中最基本的策略是分散 - 聚集,其中“主”进程(通常是等级为0的进程)将通过让它们全部调用在对等体(包括主进程本身)之间平均分配工作数组分散,对等体将完成工作,然后所有同伴将调用gather将结果发送回master。

在你的素数算法示例中,构建一个整数数组,将其“分散”给所有对等体,每个对等体将通过其数组运行,如果它是素数,则保存为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。