0

node00 はランク 1 の node01 に情報を正常に送信できますが、node01 への 2 回目の送信ではブロックされます。なぜそれが起こったのですか?どうもありがとう。コードにデッドロックはないと思います。

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
}
............
4

3 に答える 3

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;
}
于 2014-06-11T09:28:41.660 に答える
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;
}
于 2019-08-01T14:16:44.413 に答える