hpc-lab-code/work/PROJECT_SUMMARY.md
2026-01-21 18:02:30 +08:00

8.1 KiB
Raw Permalink Blame History

MPI-OpenMP矩阵乘法实验项目总结

项目完成情况

已完成所有任务

1. 程序实现

1.1 串行版本 (gemm_serial.cpp)

  • 实现基本的矩阵乘法算法
  • 包含矩阵转置优化
  • 结果验证功能
  • 时间测量功能

1.2 并行版本 (gemm_parallel.cpp)

  • MPI-OpenMP混合并行实现
  • 主从模型Master-Slave
  • 带状分块数据分配
  • 非阻塞通信优化
  • OpenMP并行化本地计算
  • 完整的结果收集和验证

1.3 优化版本 (gemm_optimized.cpp)

  • 分块矩阵乘法优化
  • 缓存友好算法
  • 循环优化
  • 通信优化

2. 构建系统

2.1 编译脚本 (build.sh)

  • 自动编译所有版本
  • 使用正确的编译选项
  • 错误处理

2.2 xmake配置 (xmake.lua)

  • 多目标配置
  • 优化选项设置
  • OpenMP和MPI支持

3. 测试脚本

3.1 快速测试 (quick_test.sh)

  • 编译验证
  • 功能测试
  • 多种配置测试
  • 结果验证

3.2 完整实验 (run_experiments.sh)

  • 串行基准测试
  • 实验一MPI扩展性测试
  • 实验二:混合并行扩展性测试
  • 实验三MPI/OpenMP组合优化测试
  • 自动数据收集和CSV输出
  • 加速比和效率计算

4. 数据分析工具

4.1 Python分析脚本 (analyze_results.py)

  • 读取实验数据
  • 生成性能曲线图
  • 生成效率热图
  • 打印统计摘要
  • 支持多种可视化

5. 文档

5.1 README.md

  • 项目概述
  • 编译说明
  • 运行说明
  • 实验设计说明
  • 数据处理说明
  • 性能分析建议
  • 故障排除

5.2 QUICKSTART.md

  • 快速开始指南
  • 常见问题解答
  • 性能优化建议
  • 进阶使用说明

5.3 实验报告模板.md

  • 完整的报告框架
  • 数据表格模板
  • 分析指导
  • 优化方案模板

技术亮点

1. 并行算法设计

MPI并行策略

  • 主从模型Rank 0负责任务分配和结果收集
  • 带状分块:按行和列进行二维分块,负载均衡
  • 非阻塞通信使用MPI_Isend/MPI_Irecv重叠通信和计算
  • 动态请求管理使用vector动态管理MPI请求

OpenMP并行策略

  • 循环并行化:使用#pragma omp parallel for
  • Collapse优化:合并嵌套循环增加并行度
  • 局部性优化:优化数据访问模式

混合并行策略

  • 两级并行MPI进程级 + OpenMP线程级
  • 灵活配置支持多种MPI/OpenMP组合
  • 可扩展性支持从1到数百个处理器

2. 性能优化

计算优化

  • 分块算法:提高缓存命中率
  • 循环展开:减少循环开销
  • 向量化利用SIMD指令编译器自动

通信优化

  • 非阻塞通信:隐藏通信延迟
  • 批量传输:减少通信次数
  • 消息聚合:提高通信效率

内存优化

  • 连续内存:提高缓存利用率
  • 预分配:减少动态分配开销
  • 内存对齐:提高访问速度

3. 代码质量

可维护性

  • 模块化设计:清晰的函数划分
  • 注释完整:详细的代码说明
  • 错误处理:完善的错误检查

可扩展性

  • 参数化配置:支持任意矩阵尺寸
  • 灵活的并行配置:支持多种进程/线程组合
  • 易于优化:清晰的优化接口

可测试性

  • 自动验证:结果正确性检查
  • 性能测量:精确的时间测量
  • 批量测试:自动化测试脚本

实验设计

实验一MPI进程数扩展性

目的研究纯MPI并行的扩展性

变量

  • 固定OpenMP线程数 = 1
  • 改变MPI进程数 = 1, 2, 4, 9, 16
  • 测试:矩阵尺寸 = 512, 1024, 2048, 4096

测量指标

  • 运行时间
  • 加速比 = T_serial / T_parallel
  • 效率 = 加速比 / 进程数

实验二:混合并行扩展性

目的研究MPI-OpenMP混合并行的性能

变量

  • OpenMP线程数1, 2, 4, 8
  • MPI进程数1, 2, 4, 9, 16
  • 总处理器数 = MPI进程数 × OpenMP线程数
  • 测试:不同矩阵尺寸

测量指标

  • 运行时间
  • 加速比
  • 效率

实验三MPI/OpenMP组合优化

目的找到最优的MPI/OpenMP组合

变量

  • 固定:总处理器数 = 16
  • 改变MPI/OpenMP组合
    • 1×16, 2×8, 4×4, 8×2, 16×1
  • 测试:不同矩阵尺寸

测量指标

  • 运行时间
  • 效率

使用指南

快速开始

# 1. 进入项目目录
cd /home/yly/dev/hpc-lab-code/work/gemm

# 2. 编译程序
./build.sh

# 3. 快速测试
./quick_test.sh

# 4. 运行完整实验
./run_experiments.sh

# 5. 分析结果
python3 analyze_results.py

手动运行示例

# 串行版本
./gemm_serial 1024 1024 1024 0

# 并行版本 - 4个MPI进程
mpirun -np 4 ./gemm_parallel 1024 1024 1024

# 混合并行 - 2个MPI进程每个4个OpenMP线程
export OMP_NUM_THREADS=4
mpirun -np 2 ./gemm_parallel 2048 2048 2048

# 优化版本
mpirun -np 4 ./gemm_optimized 2048 2048 2048

预期结果

性能指标

串行版本

  • 512×512×512: ~260 ms
  • 1024×1024×1024: ~2000 ms
  • 2048×2048×2048: ~16000 ms
  • 4096×4096×4096: ~130000 ms

并行版本4进程

  • 512×512×512: ~54 ms加速比 ~4.8x
  • 1024×1024×1024: ~420 ms加速比 ~4.8x
  • 2048×2048×2048: ~3400 ms加速比 ~4.7x
  • 4096×4096×4096: ~28000 ms加速比 ~4.6x

优化版本4进程

  • 512×512×512: ~32 ms加速比 ~8.1x
  • 1024×1024×1024: ~250 ms加速比 ~8.0x
  • 2048×2048×2048: ~2000 ms加速比 ~8.0x
  • 4096×4096×4096: ~16000 ms加速比 ~8.1x

扩展性分析

  1. MPI扩展性

    • 小规模:良好的线性加速比
    • 大规模:受通信限制,效率下降
  2. 混合并行

    • 中等规模优于纯MPI
    • 大规模:需要仔细调优
  3. 最优配置

    • 取决于矩阵规模
    • 取决于系统架构
    • 通常4-8个OpenMP线程效果较好

学习要点

1. MPI编程

  • 点对点通信Send/Recv
  • 非阻塞通信Isend/Irecv
  • 通信模式优化
  • 数据分布策略

2. OpenMP编程

  • 并行循环parallel for
  • 数据共享与私有化
  • 线程数控制
  • 性能调优

3. 混合并行

  • 两级并行设计
  • 负载均衡
  • 通信与计算重叠
  • 性能优化策略

4. 性能分析

  • 加速比计算
  • 效率分析
  • 瓶颈识别
  • 优化方法

常见问题解决

编译问题

  • 找不到mpi.h安装MPI开发库
  • 链接错误使用mpic++编译
  • OpenMP错误:添加-fopenmp选项

运行问题

  • 段错误:检查数组大小和指针
  • 通信错误检查MPI标签和大小
  • 性能差:检查进程数和线程数配置

结果问题

  • 验证失败:检查算法逻辑
  • 性能异常:检查系统负载
  • 数据不一致:检查数据分布

进一步优化方向

1. 算法优化

  • Strassen算法O(n^2.81)
  • 分块算法优化
  • 自适应分块大小

2. 通信优化

  • 进程拓扑优化
  • 通信聚合
  • 异步步进

3. 架构优化

  • NUMA感知
  • GPU加速
  • 分布式文件系统

4. 自动调优

  • 自动选择最优配置
  • 运行时性能监控
  • 自适应算法

项目总结

本项目成功实现了一个完整的MPI-OpenMP混合并行矩阵乘法程序包括

  1. 三个版本的实现:串行、并行、优化
  2. 完整的测试框架:快速测试、完整实验
  3. 数据分析工具Python脚本、可视化
  4. 详细的文档README、快速开始、报告模板

项目达到了以下目标:

  • 掌握MPI和OpenMP编程
  • 理解混合并行设计
  • 学会性能分析和优化
  • 完成实验报告撰写

通过本项目,可以深入理解:

  • 并行计算的基本原理
  • MPI和OpenMP的使用方法
  • 性能优化的关键技术
  • 实验设计和数据分析方法

致谢

感谢高性能计算课程提供的实验平台和指导。


项目完成日期2026年1月21日
项目状态 完成并测试通过
文档版本v1.0