我正在C/MPI建立一個分佈式Web服務器,似乎點對點通信完全停止後,我的代碼中的第一個MPI_BARRIER工作。標準C代碼在屏障後工作,所以我知道每個線程都通過屏障。在屏障之前,點對點通信也可以正常工作。但是,當我在屏障之前複製粘貼與屏蔽線相同的代碼時,它會完全停止工作。 SEND將永遠等待。當我嘗試使用ISEND代替它時,它通過線路,但從未接收到該消息。我一直在使用googling這個問題很多,每個有MPI_BARRIER問題的人都被告知這個屏障能夠正常工作,並且他們的代碼是錯誤的,但是我不知道爲什麼我的代碼是錯誤的。什麼可能導致這種行爲?MPI_SEND停止工作後MPI_BARRIER
下面是一個說明這是一個示例程序:
#include <mpi.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
int procID;
int val;
MPI_Status status;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &procID);
MPI_Barrier(MPI_COMM_WORLD);
if (procID == 0)
{
val = 4;
printf("Before send\n");
MPI_Send(&val, 1, MPI_INT, 1, 4, MPI_COMM_WORLD);
printf("after send\n");
}
if (procID == 1)
{
val = 1;
printf("before: val = %d\n", val);
MPI_Recv(&val, 1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
printf("after: val = %d\n", val);
}
MPI_Finalize();
return 0;
}
移動兩個if
語句障礙導致該程序正常運行之前。
編輯 - 看起來第一次通信,無論類型,工作原理以及所有將來的通信都失敗。起初我認爲這更一般。第一次溝通是障礙還是其他一些信息並不重要,沒有任何未來的溝通可以正常工作。
您發佈的代碼對我來說看起來很好。你使用的是什麼版本的MPI? – suszterpatt
隨着openmpi 1.5.5適合我。 – chemeng
我知道這是openmpi,但我似乎無法弄清楚什麼版本號。有沒有告訴你的命令? – TEOUltimus