首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MPI点对点通信到集合通信

MPI点对点通信到集合通信
EN

Stack Overflow用户
提问于 2019-01-17 21:00:35
回答 1查看 139关注 0票数 1

我正在学习MPI,我正在尝试将我的MPI程序从点对点通信转换为MPI集合。

下面是我使用MPI点对点通信进行矩阵乘法的代码片段...

代码语言:javascript
运行
复制
int i;
    if(rank == 0) {
        for(i = 1; i < size; i++){
            MPI_Send(&rows, 1, MPI_INT, i, 0, MPI_COMM_WORLD);
            MPI_Send(&columns, 1, MPI_INT, i, 0, MPI_COMM_WORLD);
        }
    } else {
        MPI_Recv(&rows, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &status);
        MPI_Recv(&columns, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &status);
    }   

    int local_block_size = rows / size;
    int process, column_pivot;

    if(rank == 0) {
        for(i = 1; i < size; i++){
            MPI_Send((matrix_1D_mapped + (i * (local_block_size * rows))), (local_block_size * rows), MPI_DOUBLE, i, 0, MPI_COMM_WORLD);
            MPI_Send((rhs + (i * local_block_size)), local_block_size, MPI_DOUBLE, i, 0, MPI_COMM_WORLD);
        }
        for(i = 0; i < local_block_size * rows; i++){
            matrix_local_block[i] = matrix_1D_mapped[i];
        }
        for(i = 0; i < local_block_size; i++){
            rhs_local_block[i] = rhs[i];
        }
    } else {
        MPI_Recv(matrix_local_block, local_block_size * rows, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, &status);
        MPI_Recv(rhs_local_block, local_block_size, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, &status);
    }

我在考虑用MPI_Bcast取代MPI_Send ...这是正确的方法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-17 21:06:38

对于第一次通信,发送到所有接收者的数据实际上是相同的,因此MPI_Bcast是正确的方法。第二次通信将较大数组的不同块分发给接收者,这是通过MPI_Scatter集体完成的。请注意,scatter在通信中包含根等级,因此您可以省略手动本地副本。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54236532

复制
相关文章

相似问题

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