305 lines
7.1 KiB
Markdown
305 lines
7.1 KiB
Markdown
# 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日
|
||
**联系方式**:通过课程助教或老师
|