01
GPU架构基础
从硬件角度看GPU与CPU的区别,理解SM、CUDA Core、显存层级结构。
硬件核心概念
02
显存体系详解
全局显存、共享显存、L1/L2缓存、寄存器文件的带宽与延迟特性。
存储层级延迟
03
带宽测试原理
带宽计算公式(Bandwidth = (Bytes) / (Time)),理解理论带宽与实际带宽的差异。
公式理论vs实际
04
CUDA编程模型
Kernel启动、Grid-Block-Thread层级、内存访问模式对带宽的影响。
编程模型线程层级
05
动手写第一个带宽测试
使用cudaMemcpy进行Host-Device数据传输,测量PCIe带宽。
cudaMemcpyPCIe
06
全局显存带宽测试
编写Kernel实现连续访问与随机访问,对比带宽差异。
全局显存连续vs随机
07
共享显存带宽测试
利用__shared__变量,测试共享显存的低延迟特性。
共享显存低延迟
08
寄存器与本地显存
理解寄存器溢出(Register Spill)对性能的影响,如何通过__launch_bounds__控制。
寄存器溢出
09
L1/L2缓存命中率分析
使用nvprof/Nsight Compute分析缓存命中率,优化数据局部性。
缓存命中率
10
内存合并访问
理解合并访问(Coalesced Access)与非合并访问对带宽的5倍以上差距。
合并访问带宽差距
11
Bank Conflict
共享显存的Bank冲突原理,如何通过Padding或改变访问模式避免。
Bank冲突Padding
12
带宽测试工具
使用bandwidthTest、shoc、stream等官方工具进行基准测试。
工具基准测试
13
Nsight Compute深度分析
使用Nsight Compute的Memory Workload分析章节,定位带宽瓶颈。
Nsight瓶颈分析
14
PCIe带宽瓶颈
分析PCIe Gen3/Gen4/Gen5的实际带宽,以及多GPU通信的NVLINK技术。
PCIeNVLINK
15
显存容量与带宽权衡
如何根据模型大小选择显存策略,理解显存不足时的Swap机制。
容量Swap
16
Pinned Memory与Zero-Copy
使用cudaHostAlloc分配页锁定内存,提升Host-Device传输带宽。
PinnedZero-Copy
17
异步传输与Stream
利用cudaMemcpyAsync和Stream实现计算与传输重叠,隐藏延迟。
异步Stream
18
统一内存(UM)
理解Managed Memory的页错误机制,测试其带宽表现与适用场景。
统一内存页错误
19
纹理显存与表面显存
使用纹理显存(Texture Memory)的缓存优化特性,测试2D局部性访问。
纹理2D局部性
20
Warp级别分析
理解Warp调度与Memory Transaction的关系,分析Warp发散对带宽的影响。
Warp发散
21
Occupancy与带宽
通过调整Block大小和寄存器数量,找到最高Occupancy与带宽的平衡点。
Occupancy寄存器
22
向量化加载
使用float4/int4等向量化类型,提升单次Memory Transaction的效率。
向量化float4
23
预取指令(Prefetching)
使用__pipeline_memcpy_async和__prefetch_global,隐藏显存延迟。
预取流水线
24
带宽与功耗
分析不同带宽利用率下的GPU功耗曲线,理解TDP与性能的关系。
功耗TDP
25
多GPU带宽测试
使用NCCL或MPI测试多GPU间的P2P带宽,分析Ring/Tree算法。
多GPUNCCL
26
显存错误检测
使用cuda-memcheck和Compute Sanitizer检测越界访问与未初始化显存。
错误检测Sanitizer
27
显存泄漏排查
使用cuda-memcheck --leak-check和Nsight的Memory Tracker定位泄漏。
泄漏Memory Tracker
28
实际案例:LLM推理
LLM推理中的显存带宽瓶颈,分析KV Cache的带宽需求。
LLMKV Cache
29
实际案例:Stencil计算
科学计算中的Stencil计算,优化3D数据访问的带宽利用率。
Stencil3D
30
总结与最佳实践
带宽优化的10条军规,以及如何撰写一份专业的带宽测试报告。
最佳实践报告