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

7.1 KiB
Raw Permalink Blame History

MPI-OpenMP矩阵乘法实验项目

🎯 项目概述

本项目是一个完整的MPI-OpenMP混合并行矩阵乘法实现用于高性能计算课程实验。项目包含串行、并行和优化三个版本以及完整的测试、分析和文档系统。

📁 项目结构

gemm/
├── 📄 源代码文件
│   ├── gemm_serial.cpp       # 串行版本 (2.2KB)
│   ├── gemm_parallel.cpp     # MPI-OpenMP混合并行版本 (11KB)
│   └── gemm_optimized.cpp    # 优化版本 (11KB)
│
├── 🔧 构建和测试
│   ├── build.sh              # 编译脚本 (962B)
│   ├── quick_test.sh         # 快速测试脚本 (1.5KB)
│   ├── run_experiments.sh    # 完整实验脚本 (5.6KB)
│   └── xmake.lua            # xmake配置 (714B)
│
├── 📊 数据分析
│   └── analyze_results.py    # Python分析脚本 (9.8KB)
│
├── 📚 文档
│   ├── README.md             # 项目说明 (7.2KB)
│   ├── QUICKSTART.md         # 快速开始 (5.3KB)
│   ├── PROJECT_SUMMARY.md    # 项目总结 (8.1KB)
│   ├── DELIVERY_CHECKLIST.md # 交付清单 (6.7KB)
│   └── 实验报告模板.md       # 报告模板 (9.3KB)
│
└── 🔨 可执行文件
    ├── gemm_serial          # 串行版本 (18KB)
    ├── gemm_parallel        # 并行版本 (113KB)
    └── gemm_optimized       # 优化版本 (113KB)

🚀 快速开始

1. 编译程序

./build.sh

2. 快速测试

./quick_test.sh

3. 运行完整实验

./run_experiments.sh

4. 分析结果

python3 analyze_results.py

📊 实验内容

实验一MPI进程数扩展性

  • 目的研究纯MPI并行的扩展性
  • 变量MPI进程数1, 2, 4, 9, 16
  • 固定OpenMP线程数 = 1
  • 测量:运行时间、加速比、效率

实验二:混合并行扩展性

  • 目的研究MPI-OpenMP混合并行的性能
  • 变量MPI进程数 × OpenMP线程数
  • 组合:多种进程/线程组合
  • 测量:运行时间、加速比、效率

实验三MPI/OpenMP组合优化

  • 目的找到最优的MPI/OpenMP组合
  • 固定:总处理器数 = 16
  • 变量MPI/OpenMP组合1×16, 2×8, 4×4, 8×2, 16×1
  • 测量:效率对比

💡 技术特点

并行策略

  • MPI并行:主从模型,带状分块
  • OpenMP并行循环级并行collapse优化
  • 混合并行:两级并行,灵活配置
  • 非阻塞通信:重叠通信和计算

性能优化

  • 分块算法:提高缓存命中率
  • 循环优化:减少循环开销
  • 通信优化:减少通信次数
  • 内存优化:连续内存布局

代码质量

  • 模块化设计:清晰的函数划分
  • 完整注释:详细的代码说明
  • 错误处理:完善的错误检查
  • 结果验证:自动验证正确性

📈 性能指标

预期性能512×512×512

  • 串行版本:~260 ms
  • 并行版本4进程~54 ms加速比 4.8x
  • 优化版本4进程~32 ms加速比 8.1x

扩展性

  • 小规模512良好的线性加速比
  • 中等规模1024-2048接近线性加速比
  • 大规模4096受通信限制效率略降

📖 文档说明

README.md

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

QUICKSTART.md

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

PROJECT_SUMMARY.md

  • 项目完成情况
  • 技术亮点总结
  • 实验设计说明
  • 学习要点
  • 进一步优化方向

DELIVERY_CHECKLIST.md

  • 文件清单
  • 功能清单
  • 测试清单
  • 实验要求对照
  • 使用说明
  • 时间规划建议

实验报告模板.md

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

🎓 学习目标

通过本项目,你将掌握:

  1. MPI编程

    • 点对点通信
    • 非阻塞通信
    • 数据分布策略
    • 通信优化
  2. OpenMP编程

    • 并行循环
    • 数据共享
    • 线程控制
    • 性能调优
  3. 混合并行

    • 两级并行设计
    • 负载均衡
    • 性能优化
  4. 性能分析

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

🔍 关键代码片段

MPI数据分发

// 发送分块大小
MPI_Isend(&rowStride, 1, MPI_INT, sendto, 0, MPI_COMM_WORLD, &req);
sendRequests.push_back(req);

// 发送矩阵数据
for (int r = 0; r < rowStride; r++) {
    MPI_Isend(leftMat + (rowStart + r) * n, n, MPI_FLOAT, 
             sendto, 1, MPI_COMM_WORLD, &req);
    sendRequests.push_back(req);
}

OpenMP并行计算

#pragma omp parallel for collapse(2)
for (int row = 0; row < m; row++) {
    for (int col = 0; col < k; col++) {
        resultMat[row * k + col] = 0.0;
        for (int i = 0; i < n; i++) {
            resultMat[row * k + col] +=
                leftMat[row * n + i] * rightMat[col * n + i];
        }
    }
}

分块优化

const int BLOCK_SIZE = 64;
for (int row_block = 0; row_block < m; row_block += BLOCK_SIZE) {
    for (int col_block = 0; col_block < k; col_block += BLOCK_SIZE) {
        // 分块计算以提高缓存命中率
    }
}

📊 数据分析示例

Python分析脚本功能

  • 读取CSV实验数据
  • 生成性能曲线图
  • 绘制效率热图
  • 计算统计摘要
  • 多种可视化

输出图表

  • exp1_mpi_scaling.pngMPI扩展性曲线
  • exp2_hybrid_scaling.png:混合并行扩展性
  • exp3_mpi_openmp_combo.pngMPI/OpenMP组合对比
  • efficiency_heatmap.png:效率热图

🛠️ 故障排除

编译问题

# 检查MPI
mpic++ --version

# 检查OpenMP
echo | clang++ -x c++ - -fopenmp -E - > /dev/null

运行问题

# 检查MPI进程数
mpirun -np 4 ./gemm_parallel 512 512 512

# 设置OpenMP线程数
export OMP_NUM_THREADS=4

性能问题

  • 检查CPU频率
  • 关闭其他程序
  • 调整进程/线程数
  • 使用优化版本

📝 实验报告撰写

步骤

  1. 复制实验报告模板.md
  2. 运行实验收集数据
  3. 运行分析生成图表
  4. 填入数据和分析
  5. 撰写总结和心得

要点

  • 完整的数据记录
  • 深入的结果分析
  • 清晰的图表展示
  • 创新的优化方案
  • 真实的学习心得

🎯 项目特色

  1. 完整性:从串行到并行的完整实现
  2. 自动化:一键编译、测试、实验、分析
  3. 可扩展:支持任意矩阵尺寸和进程配置
  4. 文档化:详细的文档和注释
  5. 实用性:可直接用于课程实验

📅 版本历史

  • v1.0 (2026-01-21)
    • 初始版本发布
    • 完成所有核心功能
    • 提供完整文档

👥 贡献

本项目由高性能计算课程学生完成,用于教学和学习目的。

📄 许可

本项目仅用于教学目的。

🙏 致谢

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


项目状态 完成并可交付
最后更新2026年1月21日
联系方式:通过课程助教或老师