繁体   English   中英

这个MPI代码有什么问题?

[英]What's wrong with this MPI code?

下面的MPI程序只是为消息定义了MPI类型,然后将消息从进程0发送到进程1。但是,它崩溃,并显示了非常错误的错误消息。 它出什么问题了?

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

struct P {
    char choices[64];
    int next_choice;
};

typedef struct P Packing;

int main(int argc,char** argv) {
    int rank;
    MPI_Datatype PACKING_TYPE;
    MPI_Init(&argc,&argv);
    MPI_Comm_rank(MPI_COMM_WORLD,&rank);

    if (rank == 0) {
        /*Defines a new MPI datatype tag for Packings.*/
        int field_count = 2;
        int field_lengths[2] = {64,1};
        MPI_Aint field_offsets[2] = {0,64 * sizeof(char)};
        MPI_Datatype field_types[2] = {MPI_CHAR,MPI_INT};
        MPI_Type_struct(field_count,field_lengths,
            field_offsets,field_types,&PACKING_TYPE);
        MPI_Type_commit(&PACKING_TYPE);
    }
    MPI_Barrier(MPI_COMM_WORLD);

    if (rank == 0) {
        Packing pack;
        MPI_Status status;
        MPI_Send(&pack,1,PACKING_TYPE,1,0,MPI_COMM_WORLD);
        puts("Process 0 sent message.");
    }

    if (rank == 1) {
        Packing pack;
        MPI_Status status;
        MPI_Recv(&pack,1,PACKING_TYPE,MPI_ANY_SOURCE,
            MPI_ANY_TAG,MPI_COMM_WORLD,&status);
        puts("Process 1 recieved message.");
    }

    MPI_Barrier(MPI_COMM_WORLD);
    if(rank == 0) {
        MPI_Type_free(&PACKING_TYPE);
    }
    MPI_Finalize();
    return 0;
}

MPI_Type_struct()MPI_Type_commit()都不进行任何通信(例如,没有通信器作为参数列表的一部分); 他们纯粹是本地运营。 因此,使用该类型的每个进程都必须创建它。 (这很有意义;任何接收数据的进程都需要了解其布局)。

因此,在摆脱了关于类型创建和释放操作的if (rank == 0)测试(以及障碍)之后,您的代码即可正常工作。

顺便说一句-实际测量偏移(例如,使用offsetof或类似方法)而不是假设它们总是最安全的; 编译器可以自由地在结构中插入(例如)填充以帮助对齐。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM