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