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

216 lines
5.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Lab4 CUDA 程序实验说明
## 实验内容
### 实验 4.2: CUDA程序的编译和运行
**文件**: `vectoradd.cu`
**实验目的**:
- 实现向量加法的CUDA程序
- 测试不同数据规模对程序执行效率的影响
**运行方式**:
```bash
./lab4.sh
```
**数据输出**: `experiment_data/vectoradd_results.txt`
**需要回答的问题**:
- 改变数组大小,测试程序执行效率和数据规模之间的关系
- 绘制数据规模 vs 执行时间的图表
- 分析性能随数据规模变化的趋势
---
### 实验 4.3: 基于CUDA优化矩阵乘法
#### 思考问题
**思考一**: matMultCUDAKernel1 对于矩阵的数据划分策略是什么?
- **提示**: 查看 `MatrixMul_kernel1.cu` 中的核函数实现
- **关键点**:
- 每个线程负责计算结果矩阵中的哪个元素?
- blockIdx 和 threadIdx 如何映射到矩阵的行列?
**思考二**: matMultCUDAKernel2 对于矩阵运算的优化策略是什么,线程同步是否是必要的,为什么?
- **提示**: 查看 `MatrixMul_kernel2.cu` 中的共享内存使用
- **关键点**:
- 共享内存的作用是什么?
- `__syncthreads()` 的作用是什么?
- 为什么需要两次 `__syncthreads()`
**思考三**: matMultCUDAKernel2 还有没有可以继续优化的空间?
- **提示**: 考虑以下优化方向
- 寄存器使用
- 内存合并访问
- 循环展开
- Warp 级别的优化
#### 实验一: CPU vs GPU 性能对比
**运行方式**:
```bash
./lab4.sh
```
**数据输出**: `experiment_data/matrixmul_comparison.txt`
**包含数据**:
1. **CPU (OpenMP)**: 不同线程数 (1, 8, 64, 256) 的性能
2. **CUDA Kernel1**: 基础 CUDA 实现的性能
3. **CUDA Kernel2**: 共享内存优化的性能
**需要绘制**:
- 不同矩阵规模下CPU vs GPU 的运行时间对比
- 加速比图表 (相对于单线程 CPU)
- FLOPS 对比图表
- 不同 OpenMP 线程数的性能对比
**矩阵规模**: 512, 1024, 2048, 4096
#### 实验二: BLOCK_SIZE 对性能的影响
**运行方式**:
```bash
./lab4.sh
```
**数据输出**: `experiment_data/blocksize_analysis.txt`
**包含数据**:
- 不同 BLOCK_SIZE (4, 8, 16, 32) 的性能对比
- 不同矩阵规模下的测试结果
**需要绘制**:
- BLOCK_SIZE vs 运行时间
- BLOCK_SIZE vs GFLOPS
- 分析最优 BLOCK_SIZE 的原因
---
## 实验数据分析建议
### 方法一: 使用 Python 脚本自动生成图表 (推荐)
**运行方式**:
```bash
# 确保已安装 matplotlib
pip install matplotlib numpy
# 运行绘图脚本
./plot_results.py
```
**生成的图表**:
- `experiment_data/figures/vectoradd_performance.png`: 向量加法性能图
- `experiment_data/figures/cpu_vs_gpu_comparison.png`: CPU vs GPU 性能对比
- `experiment_data/figures/blocksize_analysis.png`: BLOCK_SIZE 性能分析
### 方法二: 手动分析数据
### 1. 数据提取
所有实验数据都保存在 `experiment_data/` 目录下,格式为表格形式,可以直接复制到 Excel 或其他数据分析工具。
### 2. 图表绘制建议
**实验 4.2**:
- 折线图: 数据规模 (N) vs 执行时间
- 分析时间复杂度
**实验 4.3 实验一**:
- 柱状图: 不同实现的运行时间对比
- 折线图: 矩阵规模 vs 加速比
- 热力图: 线程数 × 矩阵规模 的性能分布
**实验 4.3 实验二**:
- 折线图: BLOCK_SIZE vs GFLOPS (不同矩阵规模)
- 分析最优 BLOCK_SIZE 的原因
### 3. 性能分析要点
**加速比计算**:
```
加速比 = CPU单线程时间 / 并行程序时间
```
**FLOPS 计算**:
```
矩阵乘法浮点运算数 = 2 × M × N × K
GFLOPS = 浮点运算数 / (时间 × 10^9)
```
**效率分析**:
- 内存带宽利用率
- 计算强度
- GPU 占用率 (Occupancy)
---
## 文件说明
### 源代码文件
- `vectoradd.cu`: 向量加法程序
- `MatrixMul_cpu.cu`: CPU OpenMP 矩阵乘法
- `MatrixMul_kernel1.cu`: CUDA 基础版本矩阵乘法
- `MatrixMul_kernel2.cu`: CUDA 共享内存优化版本
- `matrixmultiply_block_size_change.cu`: 不同 BLOCK_SIZE 性能测试
### 配置文件
- `xmake.lua`: xmake 构建配置
- `lab4.sh`: 实验数据收集脚本
### 输出目录
- `experiment_data/`: 实验数据输出目录
- `gpu_info.txt`: GPU 信息
- `vectoradd_results.txt`: 向量加法测试结果
- `matrixmul_comparison.txt`: CPU vs GPU 对比数据
- `blocksize_analysis.txt`: BLOCK_SIZE 分析数据
---
## 编译和运行
### 编译所有程序
```bash
cd lab4
xmake
```
### 运行实验并收集数据
```bash
./lab4.sh
```
### 单独运行某个程序
```bash
cd build/linux/x86_64/release
./vectoradd
./MatrixMul_cpu
./MatrixMul_kernel1
./MatrixMul_kernel2
./matrixmultiply_block_size_change
```
---
## 实验报告要求
### 必须包含的内容
1. **思考题答案**: 详细回答三个思考问题
2. **性能数据**: 完整的测试数据表格
3. **图表分析**: 至少包含以下图表
- 向量加法: 数据规模 vs 时间
- 矩阵乘法: CPU vs GPU 性能对比
- 矩阵乘法: 加速比分析
- BLOCK_SIZE: 性能影响分析
4. **结论分析**:
- 不同优化策略的效果
- 最优配置选择
- 性能瓶颈分析
### 可选的加分项
- 使用 Python (matplotlib) 生成更专业的图表
- GPU 性能分析工具 (nvprof, Nsight) 的分析结果
- 更深入的优化建议和实现