在CUDA算子开发(尤其是LLM场景下),核心术语主要围绕GPU硬件架构、CUDA编程模型、算子优化、性能分析四大类,下面我会按类别整理高频术语+通俗解释+应用场景,帮你快速掌握核心概念,适配LLM算子开发岗位的学习和面试需求。
一、GPU硬件架构相关术语(理解硬件是优化的基础)
| 术语 | 核心概念 | 与LLM算子开发的关联 |
|---|---|---|
| SM(Streaming Multiprocessor) | GPU的核心计算单元("计算核心"),每个SM包含多个CUDA核心、共享内存、寄存器等。 | LLM算子(如Attention)的线程块会分配到不同SM上,SM的数量决定GPU并行计算能力(如A100有108个SM)。 |
| CUDA Core | SM内的基础计算单元,负责执行整数/单精度浮点运算(FP32)。 | 常规算子(如ReduceSum)的基础运算依赖CUDA Core,LLM的低精度计算(FP16)也主要靠它。 |
| Tensor Core | 英伟达专为矩阵乘/卷积设计的专用计算单元,支持FP16/BF16/FP8混合精度计算。 | LLM的核心是矩阵乘(QKV相乘、FFN层GEMM),Tensor Core能让矩阵乘性能提升数倍,是LLM算子优化的核心抓手。 |
| Shared Memory | SM级别的高速共享内存(访存速度≈寄存器,远快于全局内存),容量小(如96KB/SM)。 | LLM算子(如FlashAttention)通过分块把数据放到Shared Memory,减少全局内存访存,降低延迟。 |
| Global Memory | GPU的全局显存(如A100的80GB HBM),访存速度慢,容量大。 | LLM的高维张量(如[batch, 4096, 4096])存储在全局内存,算子优化的核心是"减少全局内存访问次数"。 |
| Register | 线程级别的私有高速存储(速度最快),每个线程拥有有限寄存器(如255个/线程)。 | 算子中寄存器使用过多会导致"寄存器溢出"(spill to global memory),反而降低性能,需合理分配。 |
| Warp | CUDA的基本执行单元,包含32个线程,SM以Warp为单位调度执行。 | LLM算子的线程划分需对齐Warp(如线程数是32的倍数),避免"Warp分化"(同一Warp内线程执行不同分支)。 |
| Warp Divergence | 同一Warp内的线程因分支语句(if/else)执行不同路径,导致部分线程闲置。 | LLM的Softmax、Dropout算子若包含条件判断,需优化逻辑避免Warp分化,否则性能下降30%+。 |
| HBM(High Bandwidth Memory) | 高带宽显存(如A100的HBM2e),带宽远高于普通GDDR,访存延迟低。 | LLM的大序列长度(如8192)算子对带宽敏感,HBM的利用率是算子性能的关键指标。 |
二、CUDA编程模型相关术语(手写算子的核心语法/概念)
| 术语 | 核心概念 | 与LLM算子开发的关联 |
|---|---|---|
| Kernel函数 | CUDA的核心执行函数(以__global__修饰),运行在GPU上,由主机(CPU)调用。 |
LLM算子(如自定义Softmax)的核心逻辑写在Kernel函数中,是手写算子的入口。 |
| Thread/Block/Grid | CUDA的三层并行模型: - Thread:最小并行单元; - Block:线程块(含多个Thread,如1024个/Block); - Grid:线程格(含多个Block)。 | LLM算子需根据张量维度划分Thread/Block(如Attention的Score矩阵按16x16分Block),最大化并行效率。 |
| Host/Device | Host指CPU,Device指GPU;数据/函数需区分"主机端"和"设备端"。 | 手写LLM算子时,需把CPU的张量数据拷贝到GPU(cudaMemcpy),执行Kernel后再拷贝回CPU。 |
| __device__函数 | 运行在GPU上的函数,只能被Kernel函数或其他__device__函数调用。 |
LLM算子的子逻辑(如Softmax的数值稳定计算)可封装为__device__函数,复用代码。 |
| __shared__变量 | 声明在Shared Memory中的变量,同一Block内的线程可共享访问。 | FlashAttention中把Q/K/V分块存入__shared__变量,减少全局内存访存,是核心优化手段。 |
| 同步(__syncthreads()) | 阻塞当前Block内的所有线程,等待所有线程执行到该位置后再继续。 | 访问Shared Memory的算子(如ReduceSum)需用__syncthreads()同步,避免线程读写冲突。 |
| 内存对齐(Memory Alignment) | 数据在内存中的地址是指定字节(如16/32字节)的倍数,访存效率更高。 | LLM的低精度张量(FP16=2字节)需对齐到16字节,否则GPU访存会触发"非对齐访问",性能下降。 |
| 异步执行(cudaStream) | GPU的流(Stream),支持Kernel函数异步执行(CPU无需等待GPU完成即可继续)。 | LLM的批量推理算子可通过多Stream并行执行,提升整体吞吐量。 |
| 混合精度计算 | 结合不同精度(如FP16计算、FP32累加),平衡性能和精度。 | LLM算子(如MatMul)用FP16/BF16计算,FP32保存梯度,既提升速度又避免精度丢失。 |
三、算子优化相关术语(LLM算子开发的核心优化方向)
| 术语 | 核心概念 | 与LLM算子开发的关联 |
|---|---|---|
| 访存绑定(Memory-Bound) | 算子的性能瓶颈是内存访问速度(而非计算速度),大部分LLM算子属于此类。 | Attention、Softmax、ReduceSum均是访存绑定算子,优化重点是"减少访存次数、提升访存效率"。 |
| 计算绑定(Compute-Bound) | 算子的性能瓶颈是计算速度(如复杂矩阵运算)。 | LLM的FFN层GEMM(通用矩阵乘)接近计算绑定,需最大化Tensor Core利用率。 |
| Coalesced Access | 全局内存的"合并访问":同一Warp的线程访问连续的内存地址,访存效率最高。 | LLM算子的张量遍历需保证合并访问(如按行优先遍历),否则全局内存带宽利用率会低于50%。 |
| 分块计算(Tiling) | 把大张量拆成小分块(Tile),适配Shared Memory容量,分块计算后合并结果。 | FlashAttention的核心是分块计算Q/K/V,避免一次性加载大矩阵导致显存溢出。 |
| 内存复用(Reuse) | 重复使用已加载到Shared Memory/寄存器的数据,避免重复从全局内存读取。 | LLM的RoPE(旋转位置编码)算子通过内存复用,减少重复计算旋转矩阵,提升效率。 |
| 向量化(Vectorization) | 用向量指令(如float4/int4)一次处理多个数据,提升访存/计算效率。 | LLM的低精度算子(FP8)可通过向量指令(如nvcuda::float8x4)批量处理数据,提升吞吐量。 |
| 算子融合(Kernel Fusion) | 把多个算子(如MatMul+Add+Softmax)合并到一个Kernel中,减少中间张量存储。 | LLM的Attention层可融合QKV生成、Score计算、Softmax,避免中间张量写入全局内存,性能提升2倍+。 |
| 数值稳定性(Numerical Stability) | 避免计算过程中出现溢出/下溢(如Softmax的e^x溢出)。 | LLM的Softmax算子必须做"减最大值"优化(x = x - max(x)),否则会出现NaN/Inf,导致推理错误。 |
四、性能分析相关术语(验证算子优化效果的核心指标)
| 术语 | 核心概念 | 与LLM算子开发的关联 |
|---|---|---|
| 吞吐量(Throughput) | 单位时间内处理的数据量(如tokens/s、TFLOPS),LLM算子的核心性能指标。 | 面试中常要求对比手写算子和PyTorch原生算子的吞吐量(如FlashAttention的tokens/s提升2倍)。 |
| 延迟(Latency) | 单个算子执行的耗时(如ms/op),推理场景下重点关注。 | LLM实时推理(如对话机器人)需降低算子延迟,通常要求单token生成延迟<50ms。 |
| 显存占用(Memory Usage) | 算子执行过程中占用的GPU显存(如GB)。 | LLM的长序列(如8192)算子需控制显存占用(如FlashAttention把O(N²)降到O(N)),避免OOM。 |
| FLOPS(Floating Point Operations Per Second) | 每秒浮点运算次数,衡量计算能力。 | LLM算子需计算TFLOPS(万亿次/秒),验证Tensor Core的利用率(如A100的Tensor Core TFLOPS需达到80%+)。 |
| Nsight Compute | 英伟达官方的CUDA算子性能分析工具,可查看SM利用率、访存效率、Warp分化等。 | 手写LLM算子后,需用Nsight Compute分析瓶颈(如Shared Memory利用率低、Warp分化高),针对性优化。 |
| Profiler | 性能分析工具(如PyTorch Profiler、NVIDIA Nsight),定位算子性能瓶颈。 | 面试中需能讲清"用Profiler发现XX问题,通过XX优化手段解决,性能提升XX%"。 |
| 精度误差(Precision Error) | 手写算子与原生算子的输出差值(如MAE、RMSE)。 | LLM算子优化需保证精度误差<1e-5,避免因低精度/分块导致输出错误。 |
总结(核心记忆点)
- 硬件层:SM/Tensor Core/Shared Memory是LLM算子优化的核心硬件资源,需围绕"提升Tensor Core利用率、减少全局内存访存"发力;
- 编程层 :Kernel函数、Thread/Block划分、
__shared__变量是手写算子的核心语法,需对齐Warp、避免Warp分化; - 优化层:分块计算、内存复用、算子融合是LLM算子(如Attention、Softmax)的核心优化手段;
- 分析层:吞吐量、显存占用、精度误差是验证算子效果的核心指标,需用Nsight Compute等工具分析。
这些术语是CUDA算子开发的"通用语言",尤其是LLM场景下的高频术语(如Tensor Core、FlashAttention分块、数值稳定性),面试中大概率会问到,建议结合手写算子(如Softmax、ReduceSum)的实践来理解,而非死记硬背。