# MPI-OpenMP矩阵乘法实验项目 ## 🎯 项目概述 本项目是一个完整的MPI-OpenMP混合并行矩阵乘法实现,用于高性能计算课程实验。项目包含串行、并行和优化三个版本,以及完整的测试、分析和文档系统。 ## 📁 项目结构 ``` gemm/ ├── 📄 源代码文件 │ ├── gemm_serial.cpp # 串行版本 (2.2KB) │ ├── gemm_parallel.cpp # MPI-OpenMP混合并行版本 (11KB) │ └── gemm_optimized.cpp # 优化版本 (11KB) │ ├── 🔧 构建和测试 │ ├── build.sh # 编译脚本 (962B) │ ├── quick_test.sh # 快速测试脚本 (1.5KB) │ ├── run_experiments.sh # 完整实验脚本 (5.6KB) │ └── xmake.lua # xmake配置 (714B) │ ├── 📊 数据分析 │ └── analyze_results.py # Python分析脚本 (9.8KB) │ ├── 📚 文档 │ ├── README.md # 项目说明 (7.2KB) │ ├── QUICKSTART.md # 快速开始 (5.3KB) │ ├── PROJECT_SUMMARY.md # 项目总结 (8.1KB) │ ├── DELIVERY_CHECKLIST.md # 交付清单 (6.7KB) │ └── 实验报告模板.md # 报告模板 (9.3KB) │ └── 🔨 可执行文件 ├── gemm_serial # 串行版本 (18KB) ├── gemm_parallel # 并行版本 (113KB) └── gemm_optimized # 优化版本 (113KB) ``` ## 🚀 快速开始 ### 1. 编译程序 ```bash ./build.sh ``` ### 2. 快速测试 ```bash ./quick_test.sh ``` ### 3. 运行完整实验 ```bash ./run_experiments.sh ``` ### 4. 分析结果 ```bash python3 analyze_results.py ``` ## 📊 实验内容 ### 实验一:MPI进程数扩展性 - **目的**:研究纯MPI并行的扩展性 - **变量**:MPI进程数(1, 2, 4, 9, 16) - **固定**:OpenMP线程数 = 1 - **测量**:运行时间、加速比、效率 ### 实验二:混合并行扩展性 - **目的**:研究MPI-OpenMP混合并行的性能 - **变量**:MPI进程数 × OpenMP线程数 - **组合**:多种进程/线程组合 - **测量**:运行时间、加速比、效率 ### 实验三:MPI/OpenMP组合优化 - **目的**:找到最优的MPI/OpenMP组合 - **固定**:总处理器数 = 16 - **变量**:MPI/OpenMP组合(1×16, 2×8, 4×4, 8×2, 16×1) - **测量**:效率对比 ## 💡 技术特点 ### 并行策略 - ✅ **MPI并行**:主从模型,带状分块 - ✅ **OpenMP并行**:循环级并行,collapse优化 - ✅ **混合并行**:两级并行,灵活配置 - ✅ **非阻塞通信**:重叠通信和计算 ### 性能优化 - ✅ **分块算法**:提高缓存命中率 - ✅ **循环优化**:减少循环开销 - ✅ **通信优化**:减少通信次数 - ✅ **内存优化**:连续内存布局 ### 代码质量 - ✅ **模块化设计**:清晰的函数划分 - ✅ **完整注释**:详细的代码说明 - ✅ **错误处理**:完善的错误检查 - ✅ **结果验证**:自动验证正确性 ## 📈 性能指标 ### 预期性能(512×512×512) - 串行版本:~260 ms - 并行版本(4进程):~54 ms(加速比 4.8x) - 优化版本(4进程):~32 ms(加速比 8.1x) ### 扩展性 - 小规模(512):良好的线性加速比 - 中等规模(1024-2048):接近线性加速比 - 大规模(4096):受通信限制,效率略降 ## 📖 文档说明 ### README.md - 项目概述和说明 - 编译和运行指南 - 实验设计详解 - 数据处理说明 - 性能分析建议 - 故障排除 ### QUICKSTART.md - 快速开始指南 - 常见问题解答 - 性能优化建议 - 进阶使用说明 ### PROJECT_SUMMARY.md - 项目完成情况 - 技术亮点总结 - 实验设计说明 - 学习要点 - 进一步优化方向 ### DELIVERY_CHECKLIST.md - 文件清单 - 功能清单 - 测试清单 - 实验要求对照 - 使用说明 - 时间规划建议 ### 实验报告模板.md - 完整的报告框架 - 数据表格模板 - 分析指导 - 优化方案模板 ## 🎓 学习目标 通过本项目,你将掌握: 1. **MPI编程** - 点对点通信 - 非阻塞通信 - 数据分布策略 - 通信优化 2. **OpenMP编程** - 并行循环 - 数据共享 - 线程控制 - 性能调优 3. **混合并行** - 两级并行设计 - 负载均衡 - 性能优化 4. **性能分析** - 加速比计算 - 效率分析 - 瓶颈识别 - 优化方法 ## 🔍 关键代码片段 ### MPI数据分发 ```cpp // 发送分块大小 MPI_Isend(&rowStride, 1, MPI_INT, sendto, 0, MPI_COMM_WORLD, &req); sendRequests.push_back(req); // 发送矩阵数据 for (int r = 0; r < rowStride; r++) { MPI_Isend(leftMat + (rowStart + r) * n, n, MPI_FLOAT, sendto, 1, MPI_COMM_WORLD, &req); sendRequests.push_back(req); } ``` ### OpenMP并行计算 ```cpp #pragma omp parallel for collapse(2) for (int row = 0; row < m; row++) { for (int col = 0; col < k; col++) { resultMat[row * k + col] = 0.0; for (int i = 0; i < n; i++) { resultMat[row * k + col] += leftMat[row * n + i] * rightMat[col * n + i]; } } } ``` ### 分块优化 ```cpp const int BLOCK_SIZE = 64; for (int row_block = 0; row_block < m; row_block += BLOCK_SIZE) { for (int col_block = 0; col_block < k; col_block += BLOCK_SIZE) { // 分块计算以提高缓存命中率 } } ``` ## 📊 数据分析示例 ### Python分析脚本功能 - 读取CSV实验数据 - 生成性能曲线图 - 绘制效率热图 - 计算统计摘要 - 多种可视化 ### 输出图表 - `exp1_mpi_scaling.png`:MPI扩展性曲线 - `exp2_hybrid_scaling.png`:混合并行扩展性 - `exp3_mpi_openmp_combo.png`:MPI/OpenMP组合对比 - `efficiency_heatmap.png`:效率热图 ## 🛠️ 故障排除 ### 编译问题 ```bash # 检查MPI mpic++ --version # 检查OpenMP echo | clang++ -x c++ - -fopenmp -E - > /dev/null ``` ### 运行问题 ```bash # 检查MPI进程数 mpirun -np 4 ./gemm_parallel 512 512 512 # 设置OpenMP线程数 export OMP_NUM_THREADS=4 ``` ### 性能问题 - 检查CPU频率 - 关闭其他程序 - 调整进程/线程数 - 使用优化版本 ## 📝 实验报告撰写 ### 步骤 1. 复制`实验报告模板.md` 2. 运行实验收集数据 3. 运行分析生成图表 4. 填入数据和分析 5. 撰写总结和心得 ### 要点 - 完整的数据记录 - 深入的结果分析 - 清晰的图表展示 - 创新的优化方案 - 真实的学习心得 ## 🎯 项目特色 1. **完整性**:从串行到并行的完整实现 2. **自动化**:一键编译、测试、实验、分析 3. **可扩展**:支持任意矩阵尺寸和进程配置 4. **文档化**:详细的文档和注释 5. **实用性**:可直接用于课程实验 ## 📅 版本历史 - **v1.0** (2026-01-21) - 初始版本发布 - 完成所有核心功能 - 提供完整文档 ## 👥 贡献 本项目由高性能计算课程学生完成,用于教学和学习目的。 ## 📄 许可 本项目仅用于教学目的。 ## 🙏 致谢 感谢高性能计算课程提供的实验平台和指导。 --- **项目状态**:✅ 完成并可交付 **最后更新**:2026年1月21日 **联系方式**:通过课程助教或老师