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

MPI矩阵转置代码补全求助、MPI学习资源及入门路径咨询

MPI矩阵转置代码补全与学习建议

一、补全后的MPI矩阵转置代码

嘿,作为编程新手能上手MPI已经很棒了!针对你提供的4x4矩阵和4进程的需求,我帮你补全了代码,每个进程负责处理原矩阵的一行,通过MPI通信完成转置:

#include <stdio.h>
#include <mpi.h>
#include <stdlib.h> // 引入exit函数所需的头文件

int main(int argc,char* argv[]) {
    int rank, size;
    int matrix[4][4]={
        {1,2,3,4},
        {5,6,7,8},
        {9,10,11,12},
        {13,14,15,16}
    };
    int transpose[4][4] = {0}; // 初始化转置矩阵
    int row[4]; // 每个进程存储一行数据

    MPI_Init(&argc,&argv);
    MPI_Comm_rank(MPI_COMM_WORLD,&rank);
    MPI_Comm_size(MPI_COMM_WORLD,&size);

    // 检查进程数是否为4,不符合则退出
    if(size!=4) {
        if(rank == 0) {
            printf("Error: This program requires exactly 4 processes!\n");
        }
        MPI_Finalize();
        exit(EXIT_FAILURE);
    }

    // 主进程(rank0)分发矩阵的每一行到对应进程
    if (rank==0) {
        // 自己保留第0行
        for(int i=0; i<4; i++) row[i] = matrix[0][i];
        // 发送第1-3行给rank1-3
        for(int dest=1; dest<4; dest++) {
            MPI_Send(matrix[dest], 4, MPI_INT, dest, 0, MPI_COMM_WORLD);
        }
    } else {
        // 其他进程接收主进程发送的行数据
        MPI_Recv(row, 4, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
    }

    // 每个进程将自己行的元素发送到对应rank的进程,构建转置矩阵的列
    int recv_buf[16];
    MPI_Allgather(row, 4, MPI_INT, recv_buf, 4, MPI_INT, MPI_COMM_WORLD);

    // 将收集到的数据整理成转置矩阵
    for(int i=0; i<4; i++) {
        transpose[rank][i] = recv_buf[i*4 + rank];
    }

    // 主进程打印转置结果
    if(rank == 0) {
        printf("Original Matrix:\n");
        for(int i=0; i<4; i++) {
            for(int j=0; j<4; j++) {
                printf("%d ", matrix[i][j]);
            }
            printf("\n");
        }
        printf("\nTransposed Matrix:\n");
        for(int i=0; i<4; i++) {
            for(int j=0; j<4; j++) {
                printf("%d ", transpose[i][j]);
            }
            printf("\n");
        }
    }

    MPI_Finalize();
    return 0;
}

代码说明:

  • 先检查进程数是否为4,不符合时主进程会打印错误信息并退出,避免后续逻辑出错
  • 主进程将原矩阵的每一行分发到对应rank的进程,保证每个进程持有一行数据
  • 使用MPI_Allgather让所有进程收集到所有行的数据,这样每个进程可以直接构建转置矩阵的一行
  • 最后由主进程统一打印原矩阵和转置后的结果,方便查看输出

二、你的学习疑问解答

1. 是否应该先学习并行编程?

完全建议你先掌握并行编程的基础概念再深入MPI!比如先理解进程/线程的区别、并行模式(数据并行、任务并行)、通信同步的基本原理,这些知识能帮你更快理解MPI的设计思想,避免写代码时一头雾水。

2. MPI相关的线上学习资源

给你推荐几个靠谱的学习途径:

  • OpenMPI官方教程:作为最常用的MPI实现之一,它的官方文档里有入门指南、示例代码和常见问题解答,内容非常实用
  • 大学公开课程:很多顶尖高校的并行编程公开课都有专门的MPI章节,比如MIT的《Parallel Computer Architecture and Programming》、斯坦福的并行编程系列课程,这些课程会从理论到实践带你入门
  • 经典书籍在线内容:《Using MPI》和《Parallel Programming with MPI》是MPI领域的经典教材,很多平台能找到它们的免费在线章节,适合系统学习
  • 开源社区示例:GitHub上有大量MPI的入门项目和示例代码,你可以跟着这些代码动手调试,快速熟悉MPI的常用函数

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 23:02:46