2013-03-11 75 views
0

节点00可以将信息发送到等级为1的节点01,但是在第二次发送到节点01时它将被阻塞。为什么发生?非常感谢。我认为代码中没有死锁。当发送第二条消息时,mpi_send将被阻塞

鉴于MPI编程,有5个节点

..... 
MPI_Comm_size(MPI_COMM_WORLD, &size); 
MPI_Comm_rank(MPI_COMM_WORLD, &rank); 
MPI_Get_processor_name(processor_name, &namelen); 
MPI_Status status; 

int buff; 

if(rank ==0) 
{ 
    buff=123; 
    for(int i=1;i<size;i++){ 
    MPI_Send(&buff, 1, MPI_INT, i, tag, MPI_COMM_WORLD); //succeed 
    MPI_Send(&buff, 1, MPI_INT, i, tag, MPI_COMM_WORLD); //blocked 
    } 
} 
else 
{ 
    MPI_Recv(&buff, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &status);//succeed 
    MPI_Recv(&buff, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &status);//blocked 
} 
............ 
+1

您是如何确定呼叫阻止的?每个等级的“标签”都很好定义和相同? – Zulan 2013-03-11 11:06:54

回答

0

你为什么不使用MPI_Isend和MPI_Irecv.These是不阻塞调用。

0
#include<stdio.h> 
#include<math.h> 
#include<mpi.h> 
#define tag 777 
int rank; 
int size; 
int main(int argc,char *argv[]) 
{ 


    MPI_Init(&argc, &argv); 
MPI_Comm_size(MPI_COMM_WORLD, &size); 
MPI_Comm_rank(MPI_COMM_WORLD, &rank); 
//MPI_Get_processor_name(processor_name, &namelen); 
MPI_Status status; 

int buff; 
int i; 
if(rank ==0) 
{ printf("hai"); 
    buff=123; 
    for(i=1;i<size;i++){ 
    MPI_Send(&buff, 1, MPI_INT, i, tag, MPI_COMM_WORLD); //succeed 
    MPI_Send(&buff, 1, MPI_INT, i, tag, MPI_COMM_WORLD); //blocked 
    } 
} 
else 
{ 
printf("hello"); 
    MPI_Recv(&buff, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &status);//succeed 
    MPI_Recv(&buff, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &status);//blocked 
} 

//MPI_Finalize(); //finalize MPI operations 
return 0; 
} 
+0

请解释你的代码 – Gwenc37 2014-06-11 09:51:12

相关问题