Строка ненормального поведения MPI_Send () и MPI_Recv () - PullRequest
0 голосов
/ 14 января 2019

Моя программа компилируется и показывает ненормальное поведение.

Используются следующие команды для компиляции

mpicc one.c -o one

mpiexec -n 2 ./one

Я пытался отладить его, но не показывал ошибку компиляции. Я не могу понять, почему моя программа работает ненормально

#include<mpi.h>
#include<stdio.h>
#include<string.h>
int main(int argc,char * argv[])
{

    char str[434];
    int n;
    int rank,size; MPI_Status status;

    MPI_Init(&argc,&argv);
    MPI_Comm_rank(MPI_COMM_WORLD,&rank);
    MPI_Comm_size(MPI_COMM_WORLD,&size);
    if(rank == 0)
    {//Sender process
        scanf("%s",&str);

        MPI_Ssend(&n,1,MPI_INT,1,0,MPI_COMM_WORLD);
        MPI_Ssend(&str,n,MPI_CHAR,1,0,MPI_COMM_WORLD);
        printf("Sending word %s in process 0\n",str);
    }
    else
    {//Receiver process
        MPI_Recv(&n,1,MPI_INT,0,0,MPI_COMM_WORLD,&status);
        MPI_Recv(&str,n,MPI_CHAR,0,0,MPI_COMM_WORLD,&status);
        printf("Receiving word %s in process 1\n",str);
    }
    MPI_Finalize();


    return 0;
}

Введите:

ха

Фактический результат

Отправка слова haha ​​в процессе 0

Получение слова хаха в процессе 1

Результат обмена

Отправка слова haha ​​в процессе 0

Получение слова в процессе 1

1 Ответ

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

Как люди любезно указали в комментариях к вашему сообщению, вы не можете использовать str таким, каким вы были, потому что scanf() ожидает char *, а вы передаете его char (*)[434], которые не то же самое.

Вы бы увидели эту ошибку (или предупреждение), если бы вы скомпилировали с флагами "-Werror -Wformat".

После изменения кода для использования указателя, а не массива char, он выглядит следующим образом:

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

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

    const int size = 434;
    char* str_send = (char*) malloc(size * sizeof(char)); // = "haha";
    char* str_recv = (char*) malloc(size * sizeof(char));
    int n = size;
    int rank;
    MPI_Status status;

    MPI_Init(&argc,&argv);
    MPI_Comm_rank(MPI_COMM_WORLD,&rank);
    MPI_Comm_size(MPI_COMM_WORLD,&size);
    if(rank == 0)
    {//Sender process
        scanf("%s", str_send);

        MPI_Ssend(&n,1,MPI_INT,1,0,MPI_COMM_WORLD);
        MPI_Ssend(str_send,n,MPI_CHAR,1,0,MPI_COMM_WORLD);
        printf("Sending word %s in process 0\n",str_send);
    }
    else
    {//Receiver process
        MPI_Recv(&n,1,MPI_INT,0,0,MPI_COMM_WORLD,&status);
        MPI_Recv(str_recv,n,MPI_CHAR,0,0,MPI_COMM_WORLD,&status);
        printf("Receiving word %s in process 1\n",str_recv);
    }
    MPI_Finalize();
    return 0;
}

Что дает вывод:

junglefox @ ubuntu: ~ / test_programs $ mpicc main.c

junglefox @ ubuntu: ~ / test_programs $ mpiexec -n 2 ./a.out

ха-ха

Отправка слова хаха в процессе 0

Получение слова хаха в процессе 1

Поскольку я считаю, что вы хотите протестировать библиотеку MPI и не увязнуть в других тонкостях, я бы предложил использовать фиксированный ввод и искать фиксированный вывод вместо использования scanf. Например,

const char* str_send = "haha";

А затем удалите или закомментируйте строку scanf.

// scanf("%s", str_send);
...