4.5 KiB
4.5 KiB
实验数据整理与简要分析
实验一: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对性能的影响规律:
- 4×4 → 8×8:性能提升约3倍(289→838 GFLOPS)
- 8×8 → 16×16:性能提升约1.5倍(838→1423 GFLOPS)
- 16×16 → 32×32:性能提升约1.05倍(1423→1574 GFLOPS)
性能提升的原因:
- 共享内存利用率提升:更大的tile意味着更多的数据重用,减少全局内存访问
- 线程级并行提升:更大的block包含更多线程,更好地隐藏内存延迟
- 计算与内存访问平衡:大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倍性能提升
总体结论
- GPU的绝对优势:即使最简单的GPU实现也比CPU快2000-2700倍
- 优化需谨慎:设计不当的"优化"(如4×4 tile)反而会降低性能
- Tile size是关键:从4×4到32×32,性能相差近5倍
- 系统化调优:需要根据硬件特性选择合适的优化策略
图表说明
实验已生成以下图表:
experiment1_analysis.png:CPU、Kernel1、Kernel2性能对比(4个子图)experiment2_analysis.png:不同BLOCK_SIZE对性能的影响(4个子图)
原始数据保存在:
matrixmul_comparison.txt:实验一原始数据blocksize_analysis.txt:实验二原始数据