# 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% **性能瓶颈:** 1. 通信开销随进程数增加而增大 2. 负载不均衡导致等待时间 3. 小矩阵下内存带宽限制 --- ## 实验二: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 | ### 简要分析 **配置规律:** 1. **MPI进程数过少(1×16)** - 节点间通信少,但节点内并行效率低 - 效率仅0.11-0.13 2. **MPI进程数过多(16×1)** - 节点间通信开销大 - 效率0.33-0.43 3. **平衡配置(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 | ### 优化方案 **主要优化技术:** 1. **循环分块**:使用64×64分块提高缓存命中率 2. **循环展开**:减少循环控制开销 3. **内存访问优化**:提高数据局部性 ### 简要分析 **性能提升:** - 小矩阵:平均提升1.09-1.62倍 - 中矩阵:平均提升1.13-1.59倍 - 大矩阵:平均提升1.12-2.07倍 - 超大矩阵:平均提升1.13-2.30倍 **效率提升:** - 优化后并行效率普遍提升 - 4×4配置在大矩阵下效率达到107% - 16×1配置提升最明显(2.07倍) **优化效果原因:** 1. 缓存利用率提升,减少缓存失效 2. 指令级并行提高,更好的流水线利用 3. 内存访问优化,提高带宽利用率 --- ## 总体结论 ### 1. 最优配置策略 **推荐配置:** - **小矩阵(<1024)**:2×2或4×2配置 - **中矩阵(1024-2048)**:4×4配置 - **大矩阵(>2048)**:4×4或8×2配置 **避免配置:** - 1×N配置(MPI进程太少) - N×1配置(OpenMP线程太少) - 过多的总进程数(>48) ### 2. 性能瓶颈分析 **主要瓶颈:** 1. **通信开销**:MPI进程数增加导致通信开销增大 2. **内存带宽**:小矩阵下内存带宽成为瓶颈 3. **负载不均衡**:矩阵分块不均导致等待时间 **优化方向:** 1. 减少通信频率和通信量 2. 提高缓存利用率 3. 优化负载均衡 ### 3. 实验价值 本实验系统地研究了MPI+OpenMP混合并行的性能特性: - 理解了MPI和OpenMP的权衡关系 - 找到了最优的配置策略(4×4) - 验证了优化方法的有效性(1.1-2.3倍提升) - 为大规模并行计算提供了参考 --- ## 图表说明 实验生成的图表: 1. `experiment1_analysis.png`:MPI进程数对性能的影响 2. `experiment2_analysis.png`:MPI×OpenMP配置分析 3. `experiment3_analysis.png`:优化前后对比 原始数据: 1. `experiment_results.csv`:完整实验数据 2. `serial_results.csv`:串行基准数据