216 lines
5.2 KiB
Markdown
216 lines
5.2 KiB
Markdown
# 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) 的分析结果
|
||
- 更深入的优化建议和实现
|