mpi_send在发送第二条消息时将被阻止

时间:2013-03-11 06:26:20

标签: mpi

node00可以将信息发送到等级为1的node01,但是在第二次发送到node01时会被阻塞。为什么会这样?非常感谢。我认为代码中没有死锁。

鉴于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
}
............

3 个答案:

答案 0 :(得分:0)

为什么不使用MPI_Isend和MPI_Irecv。这些是非阻塞呼叫。

答案 1 :(得分: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;
}

答案 2 :(得分:0)

您应使用mpi_finialize,如下所示:

int main(int argc, char *argv[])
{

    int rank, size;

    MPI_Init(&argc, &argv);
    MPI_Comm_size(MPI_COMM_WORLD, &size);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    int buff, tag = 99;
    MPI_Status status;
    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
        printf("%d\n", buff);
        MPI_Recv(&buff, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &status); //blocked
        printf("%d\n", buff);
    }

    MPI_Finalize();
    return 0;
}