首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MPI_Send仅适用于静态分配的缓冲区。

MPI_Send仅适用于静态分配的缓冲区。
EN

Stack Overflow用户
提问于 2014-05-08 21:34:54
回答 1查看 485关注 0票数 1

如果我想定义自己的类型,并使用它作为MPI_Send的数据类型,只从矩阵中提取偶数行,那么该矩阵(发送缓冲区)是否必须静态分配?

当我动态地分配它时,我似乎遇到了问题。这是因为需要连续的地址才能发送数据吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-09 07:39:27

不,与MPI_Send一起发送的内存不必静态分配。

要发送数组子集,您可能需要使用MPI_Type_indexed。下面是来自MPI_Type_indexed的一个稍微修改过的示例版本,在这里我替换了静态分配的缓冲区

代码语言:javascript
运行
复制
int buffer[27];

到动态分配的缓冲区。

代码语言:javascript
运行
复制
int* buffer = (int*)malloc(27 * sizeof(int));

我希望它能帮上忙:

代码语言:javascript
运行
复制
#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;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23552968

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档