我正在编写分布式分支并绑定tsp算法。这个想法是流程可以找到更好的约束,当它们执行时,它们可以将它发送到其他流程。我用Isend en Ircv实现了这个,这很好。
我的代码的第二部分输出了最好的解决方案。我的奴隶进程将最佳解决方案发送给我的主人,我的主人检查收到的解决方案是否更好。这是通过阻止发送和接收来实现的:
bestSolution = calloc(amount, sizeof(int));
bestSolution[0] = INT_MAX;
recSolution = calloc(amount, sizeof(int));
recSolution[0] = INT_MAX;
//...
MPI_Init(&argc, (char ***) &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &processId);
MPI_Comm_size(MPI_COMM_WORLD, &amountOfProcesses);
//...
if (processId != 0){
MPI_Send(bestSolution, amount, MPI_INT, 0, 1, MPI_COMM_WORLD);
//print FINAL BEST sent
}
if (processId == 0){
for (int i = 1; i < amountOfProcesses; i++){
//print starting to receive
MPI_Recv(recSolution, amount, MPI_INT, i, 1, MPI_COMM_WORLD, &recStatus);
//print final best received
//do stuff with recSolution
}
}
// ...
// print dead
MPI_finalize();
所有变量在发送时都包含正确的数据,如果接收到数据,则接收的变量包含正确的内容。唯一的问题是以下(我的调试输出的一部分有4个进程):
2: FINAL BEST sent: 387
2 dead
3: FINAL BEST sent: 345
3 dead
0: starting to receive 1...
0: final best received: 345
0: starting to receive 2...
1: FINAL BEST sent: 345
1 dead
因此代码在进程0上死锁,试图接收进程2的消息。
奇怪的部分:它与3个或5个进程完美配合,但每次使用4个进程时它都会死锁。每个进程都会到达代码的这一部分而不会对任何进程量产生任何问题,所以我认为问题不在于在执行程序的这部分之前发生的代码。
为什么这段代码会死锁?因为我没有得到任何mpi警告/错误,所以它非常直接地使用消息传递并且可用内存不是问题,我在这里不知所措。