MPI在嵌套循环中调用和接收

时间:2013-01-23 17:13:02

标签: mpi

我有一个嵌套循环,从循环内部调用我想要的MPI发送 向接收器发送特定值然后在接收器处获取数据并再次发送MPI消息 到另一组CPU ...我使用了类似的东西,但看起来接收中有一个问题......我无法看到我哪里出错......“机器在某处无限循环......” / p>

我想让它像这样工作: 主CPU>>发送到其他CPU>>发送到从CPU

 . 
 . 
 . 

 int currentCombinationsCount; 
 int mp; 

 if (rank == 0)
 {


     for (int pr = 0; pr < combinationsSegmentSize; pr++)
     {
         int CblockBegin = CombinationsSegementsBegin[pr];
         int CblockEnd   = CombinationsSegementsEnd  [pr];
         currentCombinationsCount = numOfCombinationsEachLoop[pr]; 
         prossessNum = 1; //specify which processor we are sending to 

         // now substitute and send to the main Processors 
         for (mp = CblockBegin; mp <= CblockEnd; mp++)
         {

             MPI_Send(&mp , 1, MPI_INT   , prossessNum, TAG, MPI_COMM_WORLD);

             prossessNum ++; 
         }

     }//this loop goes through all the specified blocks for the combinations  
 } // end of rank 0
 else if (rank > currentCombinationsCount)
 {
       // here I want to put other receives that will take values from the else below 
 }
 else 
 {
     MPI_Recv(&mp , 1, MPI_INT   , 0, TAG, MPI_COMM_WORLD, &stat);
     // the code stuck here in infinite loop 
 }

1 个答案:

答案 0 :(得分:0)

您只在currentCombinationsCount分支内初始化if(rank==0),因此所有其他过程都会看到未初始化的变量。那将是result in undefined behaviour,结果取决于你的编译器。您的程序可能会崩溃,或者值可能设置为0或未确定的值。

如果你很幸运,the value may be set to 0在这种情况下你的分支会缩小为:

if (rank == 0) {  /* rank == 0 will enter this } 
else if (rank > 0) { /* all other procs enter this }
else { /* never entered! Recvs are never called to match the sends */ }

因此,您最终得到的任何接收都不匹配。从MPI_Send is potentially blocking开始,发送过程可能会无限期地停止。有了procs阻止发送,它肯定看起来像是思想“......机器在某个地方进入无限循环......”

如果currentCombinationsCount被赋予任意值(而不是0),那么rank!=0个进程将进入任意分支(所有进入最终else的概率更高)。然后,您最终得到第二组未被调用的接收,导致出现与上述相同的问题。