MPI发送和接收MPI类型结构中的指针

MPI发送和接收MPI类型结构中的指针,mpi,mpich,Mpi,Mpich,我想用MPI_Type_结构发送一组数据,其中一个是指向数组的指针(因为我要使用的矩阵非常大,我需要执行malloc)。我看到的问题是,除了矩阵之外,所有数据都正确传递。我知道通过指针传递矩阵是可能的,因为如果我只发送矩阵的指针,就会观察到正确的结果 #include <mpi.h> #include <stdio.h> #include <stdlib.h> void main(int argc, char *argv[]) { MPI_Init

我想用MPI_Type_结构发送一组数据,其中一个是指向数组的指针(因为我要使用的矩阵非常大,我需要执行malloc)。我看到的问题是,除了矩阵之外,所有数据都正确传递。我知道通过指针传递矩阵是可能的,因为如果我只发送矩阵的指针,就会观察到正确的结果

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

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

    MPI_Init(&argc, &argv);
    int size, rank;
    int m,n;
    m=n=2;

    MPI_Comm_size(MPI_COMM_WORLD, &size);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);

    typedef struct estruct
    {
        float *array;
        int sizeM, sizeK, sizeN, rank_or;
    } ;

    struct estruct kernel, server;

    MPI_Datatype types[5] = {MPI_FLOAT, MPI_INT,MPI_INT,MPI_INT,MPI_INT};
    MPI_Datatype newtype;
    int lengths[5] = {n*m,1,1,1,1};
    MPI_Aint displacements[5];
    displacements[0] = (size_t) & (kernel.array[0]) - (size_t)&kernel;
    displacements[1] = (size_t) & (kernel.sizeM) - (size_t)&kernel;
    displacements[2] = (size_t) & (kernel.sizeK) - (size_t)&kernel;
    displacements[3] = (size_t) & (kernel.sizeN) - (size_t)&kernel;
    displacements[4] = (size_t) & (kernel.rank_or) - (size_t)&kernel;


    MPI_Type_struct(5, lengths, displacements, types, &newtype);
    MPI_Type_commit(&newtype);

    if (rank == 0)
    {
        kernel.array  = (float *)malloc(m * n * sizeof(float));
        for(int i = 0; i < m*n; i++) kernel.array[i] = i;
        kernel.sizeM = 5;
        kernel.sizeK = 5;
        kernel.sizeN = 5;
        kernel.rank_or = 5;
        MPI_Send(&kernel, 1, newtype, 1, 0, MPI_COMM_WORLD);
    }
    else
    {
        server.array  = (float *)malloc(m * n * sizeof(float));
        MPI_Recv(&server, 1, newtype, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);

        printf("%i \n", server.sizeM);
        printf("%i \n", server.sizeK);
        printf("%i \n", server.sizeN);
        printf("%i \n", server.rank_or);
        for(int i = 0; i < m*n; i++) printf("%f\n",server.array[i]);
    }

    MPI_Finalize();
}

我希望有人能帮助我。

问题在这里:
(size\u t)和(kernel.array[0])-(size\u t)和kernel。此时,
kernel.array
未初始化,并且
kernel.array[0]
取消引用是未定义的行为,可能导致分段错误。即使已经分配了数组,该置换也将是实例
内核的置换。但是实例
服务器的
可能不同,并且
MPI_Recv()
可能会失败。您可以尝试先使用数据类型发送结构,然后单独发送数组。否则,对于复杂的结构,通常会考虑序列化。非常感谢您的回答。问题是每次我需要从不同的进程向进程0发送两个矩阵。这就是为什么我尝试用struct发送所有内容,从而加快消息的速度。我会试试你给我的选择。再次感谢您,问题就在这里:
(size\u t)和(kernel.array[0])-(size\u t)和kernel。此时,
kernel.array
未初始化,并且
kernel.array[0]
取消引用是未定义的行为,可能导致分段错误。即使已经分配了数组,该置换也将是实例
内核的置换。但是实例
服务器的
可能不同,并且
MPI_Recv()
可能会失败。您可以尝试先使用数据类型发送结构,然后单独发送数组。否则,对于复杂的结构,通常会考虑序列化。非常感谢您的回答。问题是每次我需要从不同的进程向进程0发送两个矩阵。这就是为什么我尝试用struct发送所有内容,从而加快消息的速度。我会试试你给我的选择。再次非常感谢
5
5
5
5
0.065004
0.000000
0.000000
0.000000

===================================================================================
=   BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES
=   PID 26206 RUNNING AT pmul
=   EXIT CODE: 11
=   CLEANING UP REMAINING PROCESSES
=   YOU CAN IGNORE THE BELOW CLEANUP MESSAGES
===================================================================================
YOUR APPLICATION TERMINATED WITH THE EXIT STRING: Segmentation fault (signal 11)
This typically refers to a problem with your application.
Please see the FAQ page for debugging suggestions