Ошибка разрушения стека MPI_Send () и MPI_Recv () - PullRequest
0 голосов
/ 14 января 2019

Я хочу устранить ошибку разбивания стека в коде

Я попытался запустить код с помощью mpicc и mpiexec

#include "mpi.h"
#include <stdio.h>
int main(int argc, char *argv[])
{
    int rank,size,x,status;
    MPI_Init(&argc,&argv);
    MPI_Comm_rank(MPI_COMM_WORLD,&rank);
    MPI_Comm_size(MPI_COMM_WORLD, &size);
    if(rank==0)
    {
        scanf("%d",&x);
        MPI_Send(&x,1,MPI_INT,1,1,MPI_COMM_WORLD);
        printf("I have send %d from process 0\n",x);
        //fflush(stdout);
    }
    else
    {
        MPI_Recv(&x,1,MPI_INT,0,1,MPI_COMM_WORLD,&status);
        printf("I have received %d in process 1\n",x);
        //fflush(stdout);
    }
    MPI_Finalize();
    return 0;
}

Я ожидал, что код напечатает операторы приема и отправки но фактический вывод печатает операторы приема и отправки и дает

* ошибка разрушения стека *

Я не могу понять, почему это происходит?

1 Ответ

0 голосов
/ 14 января 2019

Вам нужно использовать MPI_Status вместо int для объявления переменной status, как показано в коде ниже.

#include <mpi/mpi.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
    int rank,size,x;

    MPI_Status status;

    MPI_Init(&argc,&argv);
    MPI_Comm_rank(MPI_COMM_WORLD,&rank);
    MPI_Comm_size(MPI_COMM_WORLD, &size);
    if(rank==0)
    {
        scanf("%d",&x);
        MPI_Send(&x,1,MPI_INT,1,1,MPI_COMM_WORLD);
        printf("I have send %d from process 0\n",x);
        //fflush(stdout);
    }
    else
    {
        MPI_Recv(&x,1,MPI_INT,0,1,MPI_COMM_WORLD,&status);
        printf("I have received %d in process 1\n",x);
        //fflush(stdout);
    }
    MPI_Finalize();
    return 0;
}
...