# 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:性能分析图表 (在此处附上所有生成的图表)