You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于C++ MPI的棋盘式分块矩阵打印算法改进求助

基于C++ MPI实现棋盘式分块矩阵打印的修改方案

要实现棋盘式分块矩阵的按行拼接打印,核心是按全局行的顺序组织各进程的输出时机,让同一全局行的各块行依次打印。以下是修改b_c_dist函数的具体算法步骤和代码示例:

关键思路

  1. 确定处理器网格:因为n/√p = b,处理器数量p必须是完全平方数,网格维度grid_dim = √p,每个进程对应网格中的(block_row, block_col)位置(block_row为行块索引,block_col为列块索引)。
  2. 按全局行块→块内行的顺序遍历打印:先处理所有行块0的块内行,再处理行块1的,以此类推;每个全局行由对应行块的所有列块的同一块内行拼接而成。
  3. 用MPI同步机制保证输出顺序,避免多进程打印乱序。

修改后的b_c_dist核心代码

void b_c_dist(int rank, int p, int b, int** local_matrix) {
    int grid_dim = sqrt(p);
    // 校验处理器数量是否为完全平方数
    if (grid_dim * grid_dim != p) {
        if (rank == 0) {
            fprintf(stderr, "Error: Processor count p must be a perfect square.\n");
        }
        MPI_Abort(MPI_COMM_WORLD, 1);
    }

    int block_row = rank / grid_dim;  // 当前进程的行块索引
    int block_col = rank % grid_dim;  // 当前进程的列块索引

    // 遍历每个全局行块
    for (int g_block_row = 0; g_block_row < grid_dim; g_block_row++) {
        // 遍历当前行块内的每一行
        for (int local_row = 0; local_row < b; local_row++) {
            // 同步所有进程,确保前一行打印完成
            MPI_Barrier(MPI_COMM_WORLD);

            // 仅当前行块的进程参与打印
            if (block_row == g_block_row) {
                // 按列块顺序依次打印,保证同一全局行的块行顺序正确
                for (int j = 0; j < grid_dim; j++) {
                    int target_rank = g_block_row * grid_dim + j;
                    if (rank == target_rank) {
                        // 打印当前块内的一行,不带换行
                        for (int k = 0; k < b; k++) {
                            printf("%d ", local_matrix[local_row][k]);
                        }
                        fflush(stdout);  // 强制刷新输出缓冲,避免乱序
                    }
                    // 等待当前列块的进程完成打印
                    MPI_Barrier(MPI_COMM_WORLD);
                }

                // 由当前行块的最后一个列块进程打印换行
                if (block_col == grid_dim - 1) {
                    printf("\n");
                    fflush(stdout);
                }
            }
        }
    }
}

代码说明

  • 网格位置计算:通过rank / grid_dim和rank % grid_dim确定进程对应的行块和列块,比如4处理器时,rank0对应(0,0),rank1对应(0,1),rank2对应(1,0),rank3对应(1,1)。
  • 同步机制:MPI_Barrier用于保证所有进程在打印下一行前完成上一行的输出,避免不同行的内容交叉。
  • 输出控制:按列块顺序让进程依次打印块内行,最后由列块末尾的进程打印换行,确保全局行的连贯性。

注意事项

  • 确保local_matrix存储的是当前进程负责的b×b块数据,且数据内容符合目标输出(比如rank0的块全为1,rank1全为2等)。
  • 必须在打印后调用fflush(stdout),否则多进程的输出缓冲可能导致内容乱序。

内容的提问来源于stack exchange,提问作者fratsquat34

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 04:21:33