7.1 KiB
7.1 KiB
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. 编译程序
./build.sh
2. 快速测试
./quick_test.sh
3. 运行完整实验
./run_experiments.sh
4. 分析结果
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
- 完整的报告框架
- 数据表格模板
- 分析指导
- 优化方案模板
🎓 学习目标
通过本项目,你将掌握:
-
MPI编程
- 点对点通信
- 非阻塞通信
- 数据分布策略
- 通信优化
-
OpenMP编程
- 并行循环
- 数据共享
- 线程控制
- 性能调优
-
混合并行
- 两级并行设计
- 负载均衡
- 性能优化
-
性能分析
- 加速比计算
- 效率分析
- 瓶颈识别
- 优化方法
🔍 关键代码片段
MPI数据分发
// 发送分块大小
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并行计算
#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];
}
}
}
分块优化
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:效率热图
🛠️ 故障排除
编译问题
# 检查MPI
mpic++ --version
# 检查OpenMP
echo | clang++ -x c++ - -fopenmp -E - > /dev/null
运行问题
# 检查MPI进程数
mpirun -np 4 ./gemm_parallel 512 512 512
# 设置OpenMP线程数
export OMP_NUM_THREADS=4
性能问题
- 检查CPU频率
- 关闭其他程序
- 调整进程/线程数
- 使用优化版本
📝 实验报告撰写
步骤
- 复制
实验报告模板.md - 运行实验收集数据
- 运行分析生成图表
- 填入数据和分析
- 撰写总结和心得
要点
- 完整的数据记录
- 深入的结果分析
- 清晰的图表展示
- 创新的优化方案
- 真实的学习心得
🎯 项目特色
- 完整性:从串行到并行的完整实现
- 自动化:一键编译、测试、实验、分析
- 可扩展:支持任意矩阵尺寸和进程配置
- 文档化:详细的文档和注释
- 实用性:可直接用于课程实验
📅 版本历史
- v1.0 (2026-01-21)
- 初始版本发布
- 完成所有核心功能
- 提供完整文档
👥 贡献
本项目由高性能计算课程学生完成,用于教学和学习目的。
📄 许可
本项目仅用于教学目的。
🙏 致谢
感谢高性能计算课程提供的实验平台和指导。
项目状态:✅ 完成并可交付
最后更新:2026年1月21日
联系方式:通过课程助教或老师