2026-01-22 04:31:52 +08:00

116 lines
4.5 KiB
Markdown
Raw 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.

# 实验数据整理与简要分析
## 实验一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
- Kernel232×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`:实验二原始数据