MPI Bsend中的不良终止

时间:2018-05-24 14:47:51

标签: c mpi

我尝试按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 :(得分:1)

您正在错误地使用MPI的缓冲模式。您通过MPI_Buffer_attach向MPI提供的缓冲区应该由MPI在内部使用。不要使用缓冲的MPI接口,它很少有用,很难做到正确。

只需移除MPI_Buffer_并使用MPI_Send代替MPI_Bsend,您就会走上正轨。 MPI_Pack可能有点笨拙,您可能希望查看insto自定义数据类型(MPI_Type_create_struct)。如果您有一个同类系统,您也可以发送struct car的原始字节。