ПЛОХОЕ ПРЕКРАЩЕНИЕ в MPI Bsend - PullRequest
0 голосов
/ 24 мая 2018

Я пытаюсь отправить упакованную структуру MPI_Bsend().Что-то я делаю не так и не могу найти решение.

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "mpi.h"

#define SIZE 10

struct car {
    int id;
    int vmax;
    char marka[SIZE];
    char model[SIZE];
};

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

    int i;
    int rank, size;

    double t1, t2;
    struct car BMW, BMW2;

    BMW.id = 1;
    strcpy(BMW.marka, "BMW");
    strcpy(BMW.model, "szybki");
    BMW.vmax = 199;

    MPI_Status status;
    MPI_Init(&argc,&argv);
    MPI_Comm_rank(MPI_COMM_WORLD,&rank);
    MPI_Comm_size(MPI_COMM_WORLD,&size);


    int rozmiar, packet_size, msg_size, position = 0,tag;
    void *bufor;

    MPI_Pack_size(2, MPI_INT, MPI_COMM_WORLD, &rozmiar);
    packet_size = rozmiar;
    MPI_Pack_size(2 * SIZE, MPI_CHAR, MPI_COMM_WORLD, &rozmiar);
    packet_size += rozmiar;

    msg_size = 2 * packet_size + MPI_BSEND_OVERHEAD;

    bufor = (void *)malloc(msg_size);
    MPI_Buffer_attach(bufor, msg_size);

    t1 = MPI_Wtime();
    if (rank == 0) {
        tag = 0;
        for(i=1;i<size;i++){ 

            MPI_Pack(&BMW.id,1, MPI_INT, bufor, msg_size, &position, MPI_COMM_WORLD);
            MPI_Pack(&BMW.vmax,1, MPI_INT, bufor, msg_size, &position, MPI_COMM_WORLD);
            MPI_Pack(&BMW.model,SIZE, MPI_CHAR, bufor, msg_size, &position, MPI_COMM_WORLD);
            MPI_Pack(&BMW.marka,SIZE, MPI_CHAR, bufor, msg_size, &position, MPI_COMM_WORLD);

            MPI_Bsend(bufor,position,MPI_PACKED,i,tag,MPI_COMM_WORLD);
        }
    } else {
        MPI_Recv(bufor,msg_size,MPI_PACKED,0,MPI_ANY_TAG,MPI_COMM_WORLD,&status);

        position = 0;

        MPI_Unpack(bufor, msg_size, &position, &BMW2.id, 1, MPI_INT, MPI_COMM_WORLD);
        MPI_Unpack(bufor, msg_size, &position, &BMW2.vmax, 1, MPI_INT, MPI_COMM_WORLD);
        MPI_Unpack(bufor, msg_size, &position, &BMW2.model, SIZE, MPI_CHAR, MPI_COMM_WORLD);
        MPI_Unpack(bufor, msg_size, &position, &BMW2.marka, SIZE, MPI_CHAR, MPI_COMM_WORLD);

        printf("rank = %d | BMW id: %d, marka: %s, model: %s, vmax: %d \n",rank, BMW2.id, BMW2.marka, BMW2.model, BMW2.vmax);
    }

    t2 = MPI_Wtime();

    MPI_Buffer_detach(&bufor, &msg_size);
    MPI_Finalize();

    if (i == size)
        printf("Elapsed time is %.15f\n", t2 - t1 );

    return(0);
}

Ошибка:

===================================================================ПЛОХОЕ ПРЕКРАЩЕНИЕ ОДНОГО ИЗ ВАШИХ ПРОЦЕССОВ ЗАЯВКИ

PID 25637, РАБОТАЮЩИЙ В Debian

КОД ВЫХОДА: 11

===================================================================== *

ВАШЕ ПРИЛОЖЕНИЕ ПРЕКРАЩЕНО СТРОКОЙ ВЫХОДА: Ошибка сегментации (сигнал 11)

1 Ответ

0 голосов
/ 25 мая 2018

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

Просто удалите MPI_Buffer_ и используйте MPI_Send вместо MPI_Bsend, и вы на правильном пути.MPI_Pack может быть немного неуклюжим, вы можете вместо этого заглянуть в пользовательские типы данных (MPI_Type_create_struct).Если у вас однородная система, вы также можете отправить необработанные байты struct car.

...