1

我有一个嵌套循环,从循环内部我调用 MPI 发送,我希望它发送给接收器一个特定的值,然后在接收器获取数据并再次将 MPI 消息发送到另一组 CPU ......我使用了一些东西像这样,但看起来接收中有问题......我看不出我哪里出错了......“机器在某处进入无限循环......

我试图让它像这样工作:主 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 
 }
4

1 回答 1

0

您只currentCombinationsCountif(rank==0)分支中进行了初始化,因此所有其他 proc 将看到一个未初始化的变量。这将导致未定义的行为,结果取决于您的编译器。您的程序可能会崩溃,或者该值可能设置为 0 或未确定的值。

如果幸运的话,该值可能会设置为 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可能会阻塞,因此发送过程可能会无限期停止。使用 procs 阻止发送,它当然可以看起来像“......机器在某处进入无限循环......”

如果currentCombinationsCount给定一个任意值(而不是 0),则rank!=0procs 将进入任意分支(所有进入 final 的机会更高else)。然后,您最终会收到未调用第二组接收,从而导致与上述相同的问题。

于 2013-01-24T10:05:15.453 回答