116 lines
4.5 KiB
Markdown
116 lines
4.5 KiB
Markdown
# 实验数据整理与简要分析
|
||
|
||
## 实验一:CPU、CUDA Kernel1、CUDA Kernel2性能对比
|
||
|
||
### 数据表格
|
||
|
||
#### 表1:执行时间对比(单位:毫秒)
|
||
|
||
| 矩阵规模 | CPU(8线程) | CPU(64线程) | CPU(256线程) | CUDA Kernel1 | CUDA Kernel2 |
|
||
|---------|-----------|------------|-------------|--------------|--------------|
|
||
| 512×512 | 747.48 | 743.61 | 748.65 | 0.316 | 0.827 |
|
||
| 1024×1024| 6033.21 | 6049.32 | 6051.76 | 2.374 | 6.484 |
|
||
| 2048×2048| 51065.61 | 50995.41 | 51083.36 | 19.190 | 53.599 |
|
||
| 4096×4096| - | - | - | 152.897 | 433.242 |
|
||
|
||
#### 表2:性能对比(GFLOPS)
|
||
|
||
| 矩阵规模 | CPU(8线程) | CUDA Kernel1 | CUDA Kernel2 | Kernel1加速比 | Kernel2加速比 |
|
||
|---------|-----------|--------------|--------------|-------------|-------------|
|
||
| 512×512 | 0.36 | 849.49 | 324.65 | 2365倍 | 904倍 |
|
||
| 1024×1024| 0.36 | 904.75 | 331.22 | 2541倍 | 930倍 |
|
||
| 2048×2048| 0.34 | 895.23 | 320.52 | 2661倍 | 953倍 |
|
||
|
||
### 简要分析
|
||
|
||
**CPU性能特点:**
|
||
- 小矩阵(256×256)时,增加线程数有1.28倍加速比
|
||
- 中大矩阵(512×512以上)时,增加线程数无效果
|
||
- CPU性能瓶颈在0.34-0.44 GFLOPS,受内存带宽限制
|
||
|
||
**CUDA Kernel1性能特点:**
|
||
- 性能稳定在850-905 GFLOPS
|
||
- 相比CPU实现2000-2700倍加速
|
||
- 优势:简单高效,内存访问模式良好
|
||
- 劣势:无数据重用,全局内存访问频繁
|
||
|
||
**CUDA Kernel2性能特点:**
|
||
- 性能稳定在317-331 GFLOPS
|
||
- 相比Kernel1性能下降2.7-2.8倍
|
||
- 原因:TILE_WIDTH=4太小,共享内存开销大于收益
|
||
- 教训:优化不当可能适得其反
|
||
|
||
**核心结论:**
|
||
- GPU相比CPU有2000-2700倍性能优势
|
||
- 简单的Kernel1优于设计不当的Kernel2
|
||
- 优化需要考虑硬件特性,盲目优化可能降低性能
|
||
|
||
---
|
||
|
||
## 实验二:BLOCK_SIZE对CUDA程序性能的影响
|
||
|
||
### 数据表格
|
||
|
||
#### 表3:不同BLOCK_SIZE下的执行时间(毫秒)
|
||
|
||
| 矩阵规模 | 4×4 | 8×8 | 16×16 | 32×32 |
|
||
|---------|-----|-----|-------|-------|
|
||
| 256×256 | 0.116 | 0.040 | 0.029 | 0.026 |
|
||
| 512×512 | 0.831 | 0.265 | 0.189 | 0.178 |
|
||
| 1024×1024 | 6.539 | 2.022 | 1.397 | 1.364 |
|
||
| 2048×2048 | 54.023 | 16.080 | 11.454 | 11.019 |
|
||
|
||
#### 表4:不同BLOCK_SIZE下的性能(GFLOPS)
|
||
|
||
| 矩阵规模 | 4×4 | 8×8 | 16×16 | 32×32 | 最大加速比 |
|
||
|---------|-----|-----|-------|-------|-----------|
|
||
| 256×256 | 289.26 | 838.19 | 1170.29 | 1292.94 | 4.47倍 |
|
||
| 512×512 | 323.04 | 1014.10 | 1423.49 | 1506.57 | 4.67倍 |
|
||
| 1024×1024 | 328.40 | 1061.88 | 1536.94 | 1574.44 | 4.79倍 |
|
||
| 2048×2048 | 318.01 | 1068.38 | 1499.84 | 1559.16 | 4.90倍 |
|
||
|
||
### 简要分析
|
||
|
||
**BLOCK_SIZE对性能的影响规律:**
|
||
1. 4×4 → 8×8:性能提升约3倍(289→838 GFLOPS)
|
||
2. 8×8 → 16×16:性能提升约1.5倍(838→1423 GFLOPS)
|
||
3. 16×16 → 32×32:性能提升约1.05倍(1423→1574 GFLOPS)
|
||
|
||
**性能提升的原因:**
|
||
1. **共享内存利用率提升**:更大的tile意味着更多的数据重用,减少全局内存访问
|
||
2. **线程级并行提升**:更大的block包含更多线程,更好地隐藏内存延迟
|
||
3. **计算与内存访问平衡**:大tile使得计算时间与内存访问时间更平衡
|
||
|
||
**性能饱和现象:**
|
||
- 从16×16到32×32,性能提升幅度减小
|
||
- 原因:共享内存容量限制、寄存器压力增加、线程块调度效率下降
|
||
|
||
**最优BLOCK_SIZE选择:**
|
||
- 对于当前GPU架构,32×32是最优选择
|
||
- 性能达到1506-1574 GFLOPS
|
||
- 相比4×4提升4.5-4.9倍
|
||
|
||
**与Kernel1对比:**
|
||
- Kernel1(无共享内存):~900 GFLOPS
|
||
- Kernel2(32×32共享内存):~1574 GFLOPS
|
||
- 正确的共享内存优化可以带来约1.7倍性能提升
|
||
|
||
---
|
||
|
||
## 总体结论
|
||
|
||
1. **GPU的绝对优势**:即使最简单的GPU实现也比CPU快2000-2700倍
|
||
2. **优化需谨慎**:设计不当的"优化"(如4×4 tile)反而会降低性能
|
||
3. **Tile size是关键**:从4×4到32×32,性能相差近5倍
|
||
4. **系统化调优**:需要根据硬件特性选择合适的优化策略
|
||
|
||
## 图表说明
|
||
|
||
实验已生成以下图表:
|
||
- `experiment1_analysis.png`:CPU、Kernel1、Kernel2性能对比(4个子图)
|
||
- `experiment2_analysis.png`:不同BLOCK_SIZE对性能的影响(4个子图)
|
||
|
||
原始数据保存在:
|
||
- `matrixmul_comparison.txt`:实验一原始数据
|
||
- `blocksize_analysis.txt`:实验二原始数据
|