我有一个嵌套循环,从循环内部调用我想要的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
}
答案 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
的概率更高)。然后,您最终得到第二组未被调用的接收,导致出现与上述相同的问题。