327 lines
9.3 KiB
Markdown
327 lines
9.3 KiB
Markdown
# MPI-OpenMP混合并行矩阵乘法实验报告
|
||
|
||
**姓名**:__________
|
||
**学号**:__________
|
||
**日期**:__________
|
||
|
||
## 1. 实验目的
|
||
|
||
1. 掌握MPI、OpenMP程序设计的基本编写、编译与运行方法
|
||
2. 了解集群环境下矩阵乘法的并行程序设计方法
|
||
3. 掌握利用(强/弱)加速比、运行时间、效率等测度分析并行程序性能
|
||
|
||
## 2. 实验环境
|
||
|
||
### 2.1 硬件环境
|
||
- CPU型号:__________
|
||
- 核心数:__________
|
||
- 内存大小:__________
|
||
|
||
### 2.2 软件环境
|
||
- 操作系统:__________
|
||
- MPI版本:__________
|
||
- 编译器版本:__________
|
||
- OpenMP版本:__________
|
||
|
||
## 3. 实验原理
|
||
|
||
### 3.1 矩阵乘法串行算法
|
||
|
||
矩阵乘法C = A × B,其中A为m×n矩阵,B为n×k矩阵,C为m×k矩阵。
|
||
|
||
串行算法复杂度:O(m×n×k)
|
||
|
||
### 3.2 并行算法设计
|
||
|
||
#### 3.2.1 MPI并行策略
|
||
- 采用主从(Master-Slave)模型
|
||
- 使用带状分块方式分配矩阵
|
||
- Rank 0负责数据分发和结果收集
|
||
|
||
#### 3.2.2 OpenMP并行策略
|
||
- 在每个MPI进程内部使用OpenMP并行化本地矩阵乘法
|
||
- 使用`#pragma omp parallel for`并行化外层循环
|
||
- 支持collapse子句增加并行度
|
||
|
||
#### 3.2.3 混合并行策略
|
||
- MPI用于节点间并行
|
||
- OpenMP用于节点内并行
|
||
- 通过调整MPI进程数和OpenMP线程数优化性能
|
||
|
||
## 4. 实验步骤与结果
|
||
|
||
### 4.1 编译与测试
|
||
|
||
#### 编译命令
|
||
```bash
|
||
./build.sh
|
||
```
|
||
|
||
#### 快速测试结果
|
||
| 测试项 | 配置 | 运行时间(ms) | 验证结果 |
|
||
|--------|------|--------------|----------|
|
||
| 串行版本 | 512×512×512 | ______ | PASSED |
|
||
| MPI并行(1进程) | 512×512×512 | ______ | PASSED |
|
||
| MPI并行(4进程) | 512×512×512 | ______ | PASSED |
|
||
| 混合并行(2×2) | 512×512×512 | ______ | PASSED |
|
||
| 优化版本(4进程) | 512×512×512 | ______ | PASSED |
|
||
|
||
### 4.2 实验一:MPI进程数扩展性
|
||
|
||
**实验条件**:OpenMP线程数固定为1
|
||
|
||
#### 4.2.1 运行时间数据
|
||
|
||
| 矩阵尺寸 | 1进程 | 2进程 | 4进程 | 9进程 | 16进程 |
|
||
|----------|-------|-------|-------|-------|--------|
|
||
| 512×512×512 | ______ | ______ | ______ | ______ | ______ |
|
||
| 1024×1024×1024 | ______ | ______ | ______ | ______ | ______ |
|
||
| 2048×2048×2048 | ______ | ______ | ______ | ______ | ______ |
|
||
| 4096×4096×4096 | ______ | ______ | ______ | ______ | ______ |
|
||
|
||
#### 4.2.2 加速比数据
|
||
|
||
| 矩阵尺寸 | 1进程 | 2进程 | 4进程 | 9进程 | 16进程 |
|
||
|----------|-------|-------|-------|-------|--------|
|
||
| 512×512×512 | 1.00 | ______ | ______ | ______ | ______ |
|
||
| 1024×1024×1024 | 1.00 | ______ | ______ | ______ | ______ |
|
||
| 2048×2048×2048 | 1.00 | ______ | ______ | ______ | ______ |
|
||
| 4096×4096×4096 | 1.00 | ______ | ______ | ______ | ______ |
|
||
|
||
#### 4.2.3 效率数据
|
||
|
||
| 矩阵尺寸 | 1进程 | 2进程 | 4进程 | 9进程 | 16进程 |
|
||
|----------|-------|-------|-------|-------|--------|
|
||
| 512×512×512 | 100% | ______ | ______ | ______ | ______ |
|
||
| 1024×1024×1024 | 100% | ______ | ______ | ______ | ______ |
|
||
| 2048×2048×2048 | 100% | ______ | ______ | ______ | ______ |
|
||
| 4096×4096×4096 | 100% | ______ | ______ | ______ | ______ |
|
||
|
||
#### 4.2.4 性能曲线图
|
||
|
||
(在此处插入 exp1_mpi_scaling.png)
|
||
|
||
#### 4.2.5 结果分析
|
||
|
||
1. **加速比分析**:
|
||
- 随着MPI进程数增加,加速比______(上升/下降)
|
||
- 在______进程时达到最大加速比
|
||
- 大规模矩阵的加速比______(优于/差于)小规模矩阵
|
||
|
||
2. **效率分析**:
|
||
- 并行效率随进程数增加而______(上升/下降)
|
||
- 效率下降的主要原因是______
|
||
- ______矩阵尺寸的效率最高
|
||
|
||
### 4.3 实验二:MPI-OpenMP混合并行扩展性
|
||
|
||
#### 4.3.1 运行时间数据(部分示例)
|
||
|
||
**OpenMP线程数 = 1**:
|
||
|
||
| 矩阵尺寸 | 总处理器=1 | 总处理器=2 | 总处理器=4 | 总处理器=8 | 总处理器=16 |
|
||
|----------|-----------|-----------|-----------|-----------|------------|
|
||
| 512×512×512 | ______ | ______ | ______ | ______ | ______ |
|
||
| 1024×1024×1024 | ______ | ______ | ______ | ______ | ______ |
|
||
| 2048×2048×2048 | ______ | ______ | ______ | ______ | ______ |
|
||
| 4096×4096×4096 | ______ | ______ | ______ | ______ | ______ |
|
||
|
||
**OpenMP线程数 = 4**:
|
||
|
||
| 矩阵尺寸 | 总处理器=1 | 总处理器=2 | 总处理器=4 | 总处理器=8 | 总处理器=16 |
|
||
|----------|-----------|-----------|-----------|-----------|------------|
|
||
| 512×512×512 | ______ | ______ | ______ | ______ | ______ |
|
||
| 1024×1024×1024 | ______ | ______ | ______ | ______ | ______ |
|
||
| 2048×2048×2048 | ______ | ______ | ______ | ______ | ______ |
|
||
| 4096×4096×4096 | ______ | ______ | ______ | ______ | ______ |
|
||
|
||
#### 4.3.2 最大加速比对比
|
||
|
||
| OpenMP线程数 | 最大加速比 | 对应总处理器数 |
|
||
|--------------|-----------|---------------|
|
||
| 1 | ______ | ______ |
|
||
| 2 | ______ | ______ |
|
||
| 4 | ______ | ______ |
|
||
| 8 | ______ | ______ |
|
||
|
||
#### 4.3.3 性能曲线图
|
||
|
||
(在此处插入 exp2_hybrid_scaling.png)
|
||
|
||
#### 4.3.4 结果分析
|
||
|
||
1. **混合并行效果**:
|
||
- 混合并行相比纯MPI______(更优/更差)
|
||
- 最优的OpenMP线程数是______
|
||
- 原因是______
|
||
|
||
2. **扩展性分析**:
|
||
- 总处理器数增加时,加速比______
|
||
- 效率随总处理器数______
|
||
- ______(大/小)规模矩阵的扩展性更好
|
||
|
||
### 4.4 实验三:MPI/OpenMP组合优化
|
||
|
||
**实验条件**:总处理器数固定为16
|
||
|
||
#### 4.4.1 效率数据
|
||
|
||
| 矩阵尺寸 | 1×16 | 2×8 | 4×4 | 8×2 | 16×1 |
|
||
|----------|------|-----|-----|-----|------|
|
||
| 512×512×512 | ______ | ______ | ______ | ______ | ______ |
|
||
| 1024×1024×1024 | ______ | ______ | ______ | ______ | ______ |
|
||
| 2048×2048×2048 | ______ | ______ | ______ | ______ | ______ |
|
||
| 4096×4096×4096 | ______ | ______ | ______ | ______ | ______ |
|
||
|
||
*注:M×N表示M个MPI进程,每个进程N个OpenMP线程*
|
||
|
||
#### 4.4.2 性能曲线图
|
||
|
||
(在此处插入 exp3_mpi_openmp_combo.png)
|
||
|
||
#### 4.4.3 结果分析
|
||
|
||
1. **最优配置**:
|
||
- 对于512×512矩阵,最优配置是______
|
||
- 对于1024×1024矩阵,最优配置是______
|
||
- 对于2048×2048矩阵,最优配置是______
|
||
- 对于4096×4096矩阵,最优配置是______
|
||
|
||
2. **配置影响分析**:
|
||
- MPI进程数较多时,效率______(高/低),原因是______
|
||
- OpenMP线程数较多时,效率______(高/低),原因是______
|
||
- ______配置的通信开销最小
|
||
- ______配置的负载均衡最好
|
||
|
||
## 5. 性能瓶颈分析与优化
|
||
|
||
### 5.1 性能瓶颈识别
|
||
|
||
通过实验分析,发现以下性能瓶颈:
|
||
|
||
1. **通信瓶颈**:
|
||
- MPI通信占用时间比例:______
|
||
- 主要通信操作:______
|
||
- 通信热点:______
|
||
|
||
2. **计算瓶颈**:
|
||
- 计算密集型操作:______
|
||
- 缓存命中率:______
|
||
- 内存带宽利用率:______
|
||
|
||
3. **负载不均衡**:
|
||
- 负载不均衡程度:______
|
||
- 原因:______
|
||
|
||
### 5.2 优化方案
|
||
|
||
#### 5.2.1 优化方案一:改进分块策略
|
||
|
||
**问题描述**:带状分块导致负载不均衡
|
||
|
||
**优化方法**:
|
||
- 采用二维块循环分块
|
||
- 优化分块大小以适应缓存
|
||
- 考虑NUMA架构
|
||
|
||
**预期效果**:效率提升______%
|
||
|
||
#### 5.2.2 优化方案二:通信优化
|
||
|
||
**问题描述**:通信开销过大
|
||
|
||
**优化方法**:
|
||
- 使用非阻塞通信重叠计算和通信
|
||
- 减少通信次数,增加每次通信的数据量
|
||
- 优化通信模式
|
||
|
||
**预期效果**:通信时间减少______%
|
||
|
||
#### 5.2.3 优化方案三:计算优化
|
||
|
||
**问题描述**:计算效率不高
|
||
|
||
**优化方法**:
|
||
- 使用分块矩阵乘法提高缓存利用率
|
||
- 使用SIMD指令向量化
|
||
- 循环展开和优化
|
||
|
||
**预期效果**:计算时间减少______%
|
||
|
||
### 5.3 优化实现与效果对比
|
||
|
||
#### 5.3.1 优化前后性能对比
|
||
|
||
| 配置 | 优化前时间(ms) | 优化后时间(ms) | 加速比 |
|
||
|------|---------------|---------------|--------|
|
||
| 4 MPI进程, 512×512 | ______ | ______ | ______ |
|
||
| 9 MPI进程, 1024×1024 | ______ | ______ | ______ |
|
||
| 16 MPI进程, 2048×2048 | ______ | ______ | ______ |
|
||
|
||
#### 5.3.2 优化效果分析
|
||
|
||
1. **分块优化**:
|
||
- 效果:______
|
||
- 原因:______
|
||
|
||
2. **通信优化**:
|
||
- 效果:______
|
||
- 原因:______
|
||
|
||
3. **计算优化**:
|
||
- 效果:______
|
||
- 原因:______
|
||
|
||
## 6. 实验总结
|
||
|
||
### 6.1 实验结论
|
||
|
||
1. **MPI并行效果**:
|
||
- MPI并行能够有效加速矩阵乘法
|
||
- 最优MPI进程数与______相关
|
||
- 加速比受______限制
|
||
|
||
2. **OpenMP并行效果**:
|
||
- OpenMP适合______并行
|
||
- 最优线程数与______相关
|
||
- 与MPI结合可以______
|
||
|
||
3. **混合并行优势**:
|
||
- 混合并行能够______
|
||
- 适合______场景
|
||
- 需要仔细调优______
|
||
|
||
### 6.2 心得体会
|
||
|
||
1. 通过本次实验,我掌握了______
|
||
2. 在并行程序设计中,______很重要
|
||
3. 性能优化需要考虑______
|
||
4. 遇到的主要困难是______,解决方法是______
|
||
|
||
### 6.3 改进建议
|
||
|
||
1. 程序可以进一步优化______
|
||
2. 实验设计可以改进______
|
||
3. 性能分析可以更深入______
|
||
|
||
## 7. 参考文献
|
||
|
||
1. MPI论坛. MPI: A Message-Passing Interface Standard.
|
||
2. OpenMP Architecture Review Board. OpenMP Specifications.
|
||
3. Grama, A., et al. Introduction to Parallel Computing.
|
||
4. 其他相关资料
|
||
|
||
## 附录
|
||
|
||
### 附录A:完整源代码
|
||
|
||
(在此处附上关键代码片段或完整代码)
|
||
|
||
### 附录B:实验原始数据
|
||
|
||
(在此处附上CSV格式的原始数据)
|
||
|
||
### 附录C:性能分析图表
|
||
|
||
(在此处附上所有生成的图表)
|