【问题标题】:MPI_Send works only with statically allocated bufferMPI_Send 仅适用于静态分配的缓冲区
【发布时间】:2014-06-26 12:09:05
【问题描述】:

如果我想定义自己的类型,并将其用作具有MPI_Send 的数据类型以仅从矩阵中获取偶数行,是否必须静态分配该矩阵(发送缓冲区)?

我在动态分配时似乎有问题。这是因为地址需要连续才能发送数据吗?

【问题讨论】:

    标签: c mpi


    【解决方案1】:

    不,使用MPI_Send 发送的内存不必静态分配。

    要发送数组子集,您可能希望使用MPI_Type_indexed。这是来自mpi.deino.net article on MPI_Type_indexed 的示例的略微修改版本,其中我替换了静态分配的缓冲区

    int buffer[27];
    

    动态分配的缓冲区

    int* buffer = (int*)malloc(27 * sizeof(int));
    

    希望对你有帮助:

    #include <mpi.h>
    #include <stdio.h>
    
    int main(int argc, char *argv[])
    {
        int rank, size, i;
        MPI_Datatype type, type2;
        int blocklen[3] = { 2, 3, 1 };
        int displacement[3] = { 0, 3, 8 };
        int* buffer = (int*)malloc(27 * sizeof(int)); //int buffer[27];
        MPI_Status status;
    
        MPI_Init(&argc, &argv);
        MPI_Comm_size(MPI_COMM_WORLD, &size);
        if (size < 2)
        {
            printf("Please run with 2 processes.\n");
            MPI_Finalize();
            return 1;
        }
        MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    
        MPI_Type_contiguous(3, MPI_INT, &type2);
        MPI_Type_commit(&type2);
        MPI_Type_indexed(3, blocklen, displacement, type2, &type);
        MPI_Type_commit(&type);
    
        if (rank == 0)
        {
            for (i=0; i<27; i++)
                buffer[i] = i;
            MPI_Send(buffer, 1, type, 1, 123, MPI_COMM_WORLD);
        }
    
        if (rank == 1)
        {
            for (i=0; i<27; i++)
                buffer[i] = -1;
            MPI_Recv(buffer, 1, type, 0, 123, MPI_COMM_WORLD, &status);
            for (i=0; i<27; i++)
                printf("buffer[%d] = %d\n", i, buffer[i]);
            fflush(stdout);
        }
    
        MPI_Finalize();
        free(buffer);
        return 0;
    }
    

    【讨论】:

    • 这里所说的一切都是正确的,我只是补充一下(upherequiteoften,您可能需要确保多维数组是连续的在内存中,即使您发送的子集不是。
    • @niklasfi 好的,谢谢您的回答,但我对多维数组会发生什么很感兴趣。我可能没有很好地形成这个问题,但我不知道我是否需要为矩阵静态分配内存,以便它们在内存中是连续的,或者我可以动态地分配内存吗?
    • @JonathanDursi 那是我感兴趣的。所以如果矩阵元素在内存中不连续,就会出现问题?
    • @breakpoint - 如果它们以可预测的方式不连续 - 比如说,更大数据结构的已知切片 - 那么你很好,你可以定义一个 MPI 数据类型来有效地将它们拉出来并将它们放入消息中(反之亦然)。如果它们以不可预测的方式不连续——比如说,你遍历 malloc()s 来构建你的数组——那就更尴尬了,你必须为每个 instance 的结构。对于技术计算,出于性能(缓存)原因,您通常希望内存始终是连续的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    • 2014-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多