在课堂实验的基础上,系统性地优化 CUDA 矩阵乘法,并使用 Nsight Compute 进行性能分析,掌握 GPU Kernel 瓶颈定位和优化的方法论。
下次课前 (一周)
__shared__ float As[32][33]) 消除 bank conflict,对比性能提示: 用 ncu --set full 查看 “shared_memory_bank_conflicts” 指标。
对 naive 和 tiled 两个版本分别运行:
ncu --set full -o matmul_report ./matmul_tiled
从报告中提取并解释:
| 指标 | Naive | Tiled | 解释 (为什么变好/变差?) |
|---|---|---|---|
| Memory Throughput (%) | |||
| Compute (SM) Throughput (%) | |||
| Occupancy (%) | |||
| Shared Memory Bank Conflicts |
核心问题: Naive 版本是 memory-bound 还是 compute-bound?Tiled 版本呢?用数据证明你的判断。
编写一个 CUDA 程序,使用 cudaGetDeviceProperties 查询你的 GPU 的硬件参数:
cudaDeviceProp prop;
cudaGetDeviceProperties(&prop, 0);
printf("GPU: %s\n", prop.name);
printf("Compute Capability: %d.%d\n", prop.major, prop.minor);
printf("SMs: %d\n", prop.multiProcessorCount);
printf("Max Threads per Block: %d\n", prop.maxThreadsPerBlock);
printf("Max Threads per SM: %d\n", prop.maxThreadsPerMultiProcessor);
printf("Shared Memory per Block: %zu KB\n", prop.sharedMemPerBlock/1024);
printf("Global Memory: %.1f GB\n", prop.totalGlobalMem/1024.0/1024.0/1024.0);
printf("Memory Bandwidth: %.1f GB/s\n",
2.0 * prop.memoryClockRate * (prop.memoryBusWidth/8) / 1.0e6);
printf("Warp Size: %d\n", prop.warpSize);
根据你的 GPU 参数,回答:
float4 类型,一次加载 4 个 float → 减少指令数| 维度 | 权重 | 要求 |
|---|---|---|
| 任务 1-3 完成度 | 60% | 完成 TILE 扫描、Nsight 分析、GPU 参数查询 |
| 分析深度 | 20% | Nsight 指标解读准确、瓶颈判断有数据支撑 |
| 代码质量 | 10% | 可编译、可复现、有注释 |
| 进阶任务 | 10% | 完成至少一项进阶任务 |