【问题标题】:MPI Point to Point Communication to Collective CommunicationMPI 点对点通信到集体通信
【发布时间】:2019-06-11 16:32:01
【问题描述】:

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

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

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 ...这是正确的方法吗?

【问题讨论】:

    标签: c++ mpi


    【解决方案1】:

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

    【讨论】:

    • 对于recv部分,我应该使用哪些集合操作?? :) @zulan
    • 您需要将 both 发送 替换为集体操作。此外,为了获得最佳广播性能,您可以将rowscolumns 复制到数组或从数组中复制,并通过一次调用进行广播。
    猜你喜欢
    • 2013-03-08
    • 2019-09-15
    • 2012-03-17
    • 2016-05-07
    • 1970-01-01
    • 2021-09-09
    • 2016-03-02
    • 2012-04-26
    • 2021-05-08
    相关资源
    最近更新 更多