0
我有以下的C/C++與微軟MPI死鎖中的Microsft MPI MPI_Isend
#include <stdio.h>
#include <stdlib.h>
#include "mpi.h"
int main (int argc, char *argv[])
{
int err, numtasks, taskid;
int out=0,val;
MPI_Status status;
MPI_Request req;
err=MPI_Init(&argc, &argv);
err=MPI_Comm_size(MPI_COMM_WORLD, &numtasks);
err=MPI_Comm_rank(MPI_COMM_WORLD, &taskid);
int receiver=(taskid+1)% numtasks;
int sender= (taskid-1+numtasks)% numtasks;
printf("sender %d, receiver %d, rank %d\n",sender,receiver, taskid);
val=50;
MPI_Isend(&val, 1, MPI_INT, receiver, 1, MPI_COMM_WORLD, &req);
MPI_Irecv(&out, 1, MPI_INT, sender, 1, MPI_COMM_WORLD, &req);
printf ("Rank: %d , Value: %d\n", taskid, out);
err=MPI_Finalize();
return 0;
}
應用程序代碼放在僵局,如果有超過2個進程啓動。 使用2個進程,應用程序可以正常工作,但不會寫入「out」。 此代碼適用於Linux mpi發行版,該問題似乎只適用於Microsoft版本。任何幫助?
爲什麼我需要使用非阻塞呼叫進行等待?我應該有不一致的數據,而不是死鎖,對吧?爲什麼在Linux發行版中我不需要「等待」電話? – Discipulos
@Discipulos你是對的。非阻塞通信允許您在整個流程中存在不一致的數據。但是,在您可以訪問數據之前,您必須確認通信完成。因此需要等待。我已經編輯了這篇文章,以更清楚地展示這可以讓你做什麼。 – NoseKnowsAll
也許Microsoft實施了非純粹的非阻塞通信,這解釋了我注意到的行爲。 謝謝! – Discipulos