MPI - 发送和接收矩阵行

时间:2011-04-03 14:29:16

标签: c mpi

我正在制作程序,用C语言在MPI中将有2-4个进程。在消除中,我通过循环映射将实际行下面的每一行发送到不同的进程。

e.g。对于矩阵5 * 6,当存在活动行0和4个进程时,我将第1行发送到进程1,将第2行发送到进程2,将第3行发送到进程3,将第4行再次发送到进程1。在theese进程中,我想进行一些计算并将一些值返回到进程0,这将把theese添加到其原始矩阵中。我的问题是,我应该使用哪个Send和Recv电话?

有一些理论代码:

if(master){

  for(...)
  //sending values to other processes
  }

  for(...)
  //recieving values from other processes
  }
}else{//for other non-master processes
  recieve value from master
  doing some computing
  sending value back to master

}

如果我只使用简单的阻塞发送,我不知道在进程1上会发生什么,因为它得到第1行和第4行,而在我将在master中进行cal recv之前,我在进程1中的值 - 第1行将是被第4行覆盖,所以我会错过一组数据,对不对?我的问题是,我应该使用什么样的MPI_Send?

1 个答案:

答案 0 :(得分:0)

如果proc 1可以在等待第4行时开始对第1行执行某些操作,那么你可能可以使用非阻塞。但是阻塞也应该没问题。

算法中内置了很多同步。每个人都必须根据当前行进行工作。因此,接收过程需要知道此过程的每次迭代需要多少工作。如果他们知道总行数以及他们当前正在进行的迭代,那么这很容易做到。因此,如果他们期望两行,他们可以执行两次阻塞recv,或者启动2次非阻塞recv,等待一次,然后立即开始处理第一行。但最容易阻止工作可能是最容易的。

即使在开始时,您可能会发现它有利于主进程执行isends,以便所有发送可以同时“启动”;然后,waitall可以按任何顺序处理它们。

但是,这种一对多的沟通可能比使用散点图更好,人们可以期望更有效地进行散布。

在这一系列问题的许多答案和评论中提出了一些问题,但我认为你没有真正解决这些问题 - 我真的希望你只是为了教育目的而完成这个项目。当有ScalapackPETScPlapack这样的经过调整和测试的工具免费下载时,真正实现自己的并行线性代数求解器将是完全,完全,疯狂的。