6.2 KiB
6.2 KiB
MPI+OpenMP混合并行矩阵乘法实验总结
实验一:固定OpenMP线程数=1,改变MPI进程数
数据表格
表1:执行时间对比(单位:ms)
| MPI进程数 | 512×512 | 1024×1024 | 2048×2048 | 4096×4096 |
|---|---|---|---|---|
| 1 | 273.31 | 1810.62 | 13666.60 | 109872.00 |
| 2 | 144.52 | 907.85 | 7226.13 | 57849.50 |
| 3 | 100.51 | 662.84 | 5063.59 | 40212.20 |
| 6 | 56.60 | 368.40 | 2638.47 | 20508.50 |
| 9 | 46.75 | 304.69 | 1949.57 | 17882.40 |
| 12 | 47.36 | 256.31 | 1891.79 | 18158.10 |
表2:加速比和效率
| MPI进程数 | 512×512加速比 | 效率 | 1024×1024加速比 | 效率 | 2048×2048加速比 | 效率 |
|---|---|---|---|---|---|---|
| 1 | 0.93 | 0.93 | 0.95 | 0.95 | 1.00 | 1.00 |
| 2 | 1.76 | 0.88 | 1.89 | 0.95 | 1.89 | 0.94 |
| 3 | 2.53 | 0.84 | 2.59 | 0.86 | 2.70 | 0.90 |
| 6 | 4.49 | 0.75 | 4.67 | 0.78 | 5.17 | 0.86 |
| 9 | 5.43 | 0.60 | 5.64 | 0.63 | 7.00 | 0.78 |
| 12 | 5.36 | 0.45 | 6.71 | 0.56 | 7.22 | 0.60 |
简要分析
扩展性特点:
- 1-6进程:扩展性良好,加速比接近线性
- 6-9进程:性能提升有限,通信开销增加
- 9-12进程:性能下降,通信开销过大
最优配置:
- 6个MPI进程是最优选择
- 效率在75%-89%之间
- 超过6个进程后效率下降到45%-78%
性能瓶颈:
- 通信开销随进程数增加而增大
- 负载不均衡导致等待时间
- 小矩阵下内存带宽限制
实验二:MPI进程数和OpenMP线程数同时改变
数据表格
表3:总进程数=16时不同配置的效率对比
| 配置 | 512×512效率 | 1024×1024效率 | 2048×2048效率 | 4096×4096效率 |
|---|---|---|---|---|
| 1×16 | 0.13 | 0.11 | 0.12 | 0.12 |
| 2×8 | 0.23 | 0.21 | 0.23 | 0.23 |
| 4×4 | 0.54 | 0.62 | 0.76 | 0.80 |
| 8×2 | 0.44 | 0.54 | 0.77 | 0.64 |
| 16×1 | 0.43 | 0.33 | 0.36 | 0.36 |
表4:不同矩阵规模下的最优配置
| 矩阵规模 | 最优配置 | 最优效率 | 最短时间(ms) |
|---|---|---|---|
| 512×512 | 4×4 | 0.54 | 29.53 |
| 1024×1024 | 4×4 | 0.62 | 173.31 |
| 2048×2048 | 8×2 | 0.77 | 1107.96 |
| 4096×4096 | 4×4 | 0.80 | 8629.08 |
简要分析
配置规律:
-
MPI进程数过少(1×16)
- 节点间通信少,但节点内并行效率低
- 效率仅0.11-0.13
-
MPI进程数过多(16×1)
- 节点间通信开销大
- 效率0.33-0.43
-
平衡配置(4×4或8×2)
- 节点间通信和节点内并行达到较好平衡
- 效率0.54-0.80
关键发现:
- 4×4配置在小中矩阵下最优
- 8×2配置在2048×2048矩阵下最优
- 大矩阵下效率较高,但未达到超线性加速
- MPI和OpenMP需要合理平衡
矩阵规模影响:
- 小矩阵:通信开销占比高,需要减少MPI进程
- 大矩阵:计算时间长,可以承受更多通信开销
实验三:优化前后性能对比
数据表格
表5:优化前后性能对比(2048×2048)
| 配置 | 优化前时间(ms) | 优化后时间(ms) | 性能提升 | 优化前效率 | 优化后效率 |
|---|---|---|---|---|---|
| 1×16 | 7011.99 | 5741.97 | 1.22x | 0.12 | 0.15 |
| 2×8 | 3705.08 | 3310.92 | 1.12x | 0.23 | 0.26 |
| 4×4 | 1117.33 | 890.86 | 1.25x | 0.76 | 0.96 |
| 8×2 | 1107.96 | 962.99 | 1.15x | 0.77 | 0.89 |
| 16×1 | 2398.38 | 1161.41 | 2.07x | 0.36 | 0.73 |
表6:优化前后性能对比(4096×4096)
| 配置 | 优化前时间(ms) | 优化后时间(ms) | 性能提升 | 优化前效率 | 优化后效率 |
|---|---|---|---|---|---|
| 1×16 | 55570.00 | 47504.30 | 1.17x | 0.12 | 0.14 |
| 2×8 | 29887.20 | 26515.60 | 1.13x | 0.23 | 0.26 |
| 4×4 | 8629.08 | 6388.64 | 1.35x | 0.80 | 1.07 |
| 8×2 | 10778.30 | 6917.64 | 1.56x | 0.64 | 0.99 |
| 16×1 | 18898.00 | 8224.09 | 2.30x | 0.36 | 0.83 |
优化方案
主要优化技术:
- 循环分块:使用64×64分块提高缓存命中率
- 循环展开:减少循环控制开销
- 内存访问优化:提高数据局部性
简要分析
性能提升:
- 小矩阵:平均提升1.09-1.62倍
- 中矩阵:平均提升1.13-1.59倍
- 大矩阵:平均提升1.12-2.07倍
- 超大矩阵:平均提升1.13-2.30倍
效率提升:
- 优化后并行效率普遍提升
- 4×4配置在大矩阵下效率达到107%
- 16×1配置提升最明显(2.07倍)
优化效果原因:
- 缓存利用率提升,减少缓存失效
- 指令级并行提高,更好的流水线利用
- 内存访问优化,提高带宽利用率
总体结论
1. 最优配置策略
推荐配置:
- 小矩阵(<1024):2×2或4×2配置
- 中矩阵(1024-2048):4×4配置
- 大矩阵(>2048):4×4或8×2配置
避免配置:
- 1×N配置(MPI进程太少)
- N×1配置(OpenMP线程太少)
- 过多的总进程数(>48)
2. 性能瓶颈分析
主要瓶颈:
- 通信开销:MPI进程数增加导致通信开销增大
- 内存带宽:小矩阵下内存带宽成为瓶颈
- 负载不均衡:矩阵分块不均导致等待时间
优化方向:
- 减少通信频率和通信量
- 提高缓存利用率
- 优化负载均衡
3. 实验价值
本实验系统地研究了MPI+OpenMP混合并行的性能特性:
- 理解了MPI和OpenMP的权衡关系
- 找到了最优的配置策略(4×4)
- 验证了优化方法的有效性(1.1-2.3倍提升)
- 为大规模并行计算提供了参考
图表说明
实验生成的图表:
experiment1_analysis.png:MPI进程数对性能的影响experiment2_analysis.png:MPI×OpenMP配置分析experiment3_analysis.png:优化前后对比
原始数据:
experiment_results.csv:完整实验数据serial_results.csv:串行基准数据