• SM内部结构
• CUDA Core工作原理
• 寄存器文件
• 调度器机制
• Warp调度策略
• 分支发散分析
• Warp协作通信
• __shfl_sync使用
• MMA操作原理
• FP16/INT8计算
• WMMA API使用
• CUTLASS库
• HBM/GDDR区别
• L2 Cache策略
• NVLink带宽
• 多卡通信基础
// ❌ 分支发散 if (threadIdx.x < 16) { do_something_A(); // 前16个线程执行 } else { do_something_B(); // 后16个线程执行 } // ✅ 避免发散 - 使用掩码 unsigned int mask = (threadIdx.x < 16) ? 0xFFFF : 0x0000; // 使用__ballot_sync()获取线程投票
// Warp Shuffle实现归约 __device__ float warp_reduce_sum(float val) { for (int offset = 16; offset > 0; offset >>= 1) { val += __shfl_down_sync(0xFFFFFFFF, val, offset); } return val; }
// Occupancy计算示例 (A100) // A100: 每SM 2048线程, 64个Warp, 65536寄存器 // Case 1: 低寄存器使用 // 每线程32寄存器 → 2048*32=65536 → 100% Occupancy // Case 2: 高寄存器使用 // 每线程64寄存器 → 1024*64=65536 → 50% Occupancy // 使用__launch_bounds__控制寄存器 __global__ void __launch_bounds(256, 2) // maxThreadsPerBlock=256, minBlocksPerSM=2 my_kernel() { // 编译器会优化寄存器使用以达到目标Occupancy }
// WMMA (Warp Matrix Multiply Accumulate) 示例 #include <mma.h> using namespace nvcuda; __global__ void tensor_core_gemm(half *A, half *B, float *C) { // 声明片段 wmma::fragment<wmma::matrix_a, 16, 16, 16, half, wmma::row_major> a_frag; wmma::fragment<wmma::matrix_b, 16, 16, 16, half, wmma::col_major> b_frag; wmma::fragment<wmma::accumulator, 16, 16, 16, float> c_frag; // 加载矩阵 wmma::load_matrix_sync(a_frag, A, 16); wmma::load_matrix_sync(b_frag, B, 16); // 执行矩阵乘加 wmma::mma_sync(c_frag, a_frag, b_frag, c_frag); // 存储结果 wmma::store_matrix_sync(C, c_frag, 16, wmma::mem_row_major); }
| 内存类型 | 容量(A100) | 带宽 | 延迟 | 用途 |
|---|---|---|---|---|
| Registers | 每线程255个 | 极高(无限) | 1周期 | 局部变量,中间结果 |
| Shared Memory | 164KB/SM | ~19TB/s | ~5周期 | 线程协作,数据复用 |
| L1 Cache | 92KB/SM | ~19TB/s | ~30周期 | 全局数据缓存 |
| L2 Cache | 40MB | ~5TB/s | ~200周期 | 全局数据缓存 |
| HBM2e | 80GB | 2TB/s | 400-800周期 | 全局数据存储 |