Parallel processing MPI代码中的错误

Parallel processing MPI代码中的错误,parallel-processing,mpi,openmpi,Parallel Processing,Mpi,Openmpi,我正在尝试使用MPI进行LU分解 下面是我的代码的快照: if(rank == 0) { //Send to each processor the row it owns for(p=0;p<n;p++) { if(map[p]!=0) { MPI_Send(&LU[p*n],n,MPI_DOUBLE,map[p],1,MPI_COMM_WORLD); printf("Sending row %d

我正在尝试使用MPI进行LU分解

下面是我的代码的快照:

if(rank == 0)
{
   //Send to each processor the row it owns
    for(p=0;p<n;p++)
    {
       if(map[p]!=0)
       {
         MPI_Send(&LU[p*n],n,MPI_DOUBLE,map[p],1,MPI_COMM_WORLD);
         printf("Sending row %d to %d  itr = %d\n",p,map[p],i);
       }
    }
}       
else
{
  printf("in else rank = %d\n",rank);

  for(l=0;l<n;l++)
  { 
    if(map[l] == rank)
    {
      printf("in loop itr = %d, rank = %d l = %d  n = %d\n",i,rank,l,n);
      MPI_Recv(&LU[l*n],n,MPI_DOUBLE,0,1,MPI_COMM_WORLD,&st);
      printf("Recv row %d at %d count = %d itr = %d\n",l,rank,count,i);
    }
  }
}
if(秩==0)
{
//将其拥有的行发送给每个处理器

对于(p=0;p而言,您的发送和接收似乎不匹配

请记住,MPI的工作方式是,每次发送消息时,另一端必须有一个匹配的接收呼叫(反之亦然)。在您的情况下,您正在将一条消息从秩0发送到另一个进程(
n
sends),并且每个进程都在发布
n
从秩0收到的消息。如果您将这些消息加起来,这意味着您是
n-1
在秩0一侧发送短消息

视觉上:

0: Send(1)[MATCHED] - Send(2)[MATCHED] - Send(3)[MATCHED]
1: Recv(0)[MATCHED] -     Recv(0)      -     Recv(0)
2: Recv(0)[MATCHED] -     Recv(0)      -     Recv(0)
更有可能的是,您只需要让除0以外的所有级别发布一个receive call

或者,如果您的模型是让秩0向彼此的秩发送一组数据,则您的程序的更好匹配可能是使用。此调用将从
秩中获取大量数据(在您的情况下,秩0),将其拆分,并发送给通讯器中的所有其他级别。这可能是您所需要的。

谢谢您的帮助


阻塞的原因不是这个循环,而是另一个recv正在等待发送。

谢谢你的回复。我实际上想过使用MPI_分散,但我要发送的数据不是连续的。例如,如果我有4个处理器和16*16数组,我希望处理器1接收第1、5、9、13行。类似于处理器2、6、10、14。我可以我想不出一个使用MPI_分散的方法来实现这一点。你的意思是每个进程都在等待n个接收。但是我的if conditin会处理它,并且只发送给少数几个其他进程。所以我认为我们的发送和revc的数量是相等的。好吧,如果你的
if
条件过滤掉了这个问题,为什么你有两个
if
语句?看来您的外部
if
应该可以解决不让秩0侦听来自自身的消息的问题。之后,似乎额外的
for
循环和
if
语句是不必要的(除非您的代码中出现了我们在这里看不到的其他情况)。如果else部分中的条件检查recv,则每个处理器只接收要接收的行。在发送时,我们将每一行发送到不同的处理器。接收进程不必这样做。发送者只应向要接收的进程发送消息。Wh如果秩0向秩1发送消息,则秩2没有收到该消息的危险,因此秩2无需进行检查以确保消息是针对它的(除非我误解了您的意思)但是我们需要保持处理器接收的消息数量的计数,就像我们忽略了
如果
条件,那么每个都将等待
秩0
中的n条消息,情况并非如此。我的这种方法正确吗?