
note llm-algo-leetcode 推理优化GPU与CPU区别CPU的初衷为执行顺序指令GPU为大规模并行与高吞吐量设计1也就是CPU单指令时延低顺序执行单个指令时CPU能更快执行面对百万级别计算时GPU强大的并行能力可以更快的完成这些计算任务CPU有较大的缓存较少的算术逻辑单元GPU则有大量的算术逻辑单元以上图片主要用于理解设计哲学实际GPU中为各种SM构成SM中含有大量的ALUGPU 的计算架构CUDA是Nvdia提供的編程接口用于编写运行在GPU上的程序使用C或者C的函数形式这个函数成为kernel比如向量加法执行kernel需要多个线程。以SMStreaming Multiprocessor为基本单元来看GPU 整体架构2GPU由多个SM组成而在SM之外仅仅有L2 cache和global memory两个组件。PSgpu sm 更类似于cpu 里的core不同sm执行不同的指令单元SM的硬件架构核心组件包括内存、计算单元和指令调度每个SM包含多个核心在 Fermi 架构之前处理核心被称为 Stream Processor每个 SP 可以执行一个线程的计算任务在 Fermi 架构之后英伟达将处理核心更名为 CUDA 核心它们共享一个指令单元但能够并行执行不同的线程。每个SM中的共享内存允许线程之间进行有效的数据交换和同步。在 Fermi 架构中一个 SM 包含 32 个 CUDA Core并配备两个 Warp Scheduler。CUDA 将 32 个线程组织成一个 Warp。由于每个调度器对应一组 16 个 CUDA Core因此一个包含 32 个线程的 Warp 的指令需要分两个周期由这 16 个 CUDA Core 执行。在 Volta 架构中V100 GPU 的每个 SM 包含 64 个 FP32 CUDA Core、32 个 FP64 Core、4 个 Warp Scheduler以及 8 个 Tensor Core。CUDA 仍然将 32 个线程组织成一个 Warp。Volta SM 被划分为 4 个处理分区每个 Warp Scheduler 负责一组固定的 Warp并向其对应的算术执行单元发射指令。对于 FP32 运算每个调度分区具有 16 个 FP32 CUDA Core因此一个包含 32 个线程的 Warp 的 FP32 指令需要两个周期完成执行与此同时4 个 Warp Scheduler 可以在每个周期分别从各自负责的 Warp 中发射独立指令。此外Volta 首次在 SM 中加入了专门用于矩阵运算的 Tensor Core。每个 V100 SM 配备 8 个 Tensor Core用于加速深度学习中大量出现的矩阵乘加运算。Tensor Core 同样属于 SM 内部的硬件执行资源并不属于某个特定 Warp一个 Warp 可以通过 Tensor Core 指令协同发起矩阵运算由 SM 内的 Tensor Core 执行。PSsm类似cpucuda core/tensor等更类似与加法器和乘法器**SFU Special Function Unit特殊函数单元它是 GPU 中SM 内部的专用计算单元不属于通用的 CUDA Core用来处理通用 ALU 无法高效计算的特殊/超越函数GPU的内存层级分析存储金字塔内存层级示意图3根据接近计算核心的远近可以6个内存层级Registers(~KB per SM, 1 cycle)最接近计算核心位置零延迟访问机制L1 Cache Shared Memory(~256 KB per SM, 1–2 cycles)由程序员管理的共享内存模式或自动处理的L1 级SMP共享L2 Cache(40–50 MB, 200–743 cycles)HBM(High Bandwidth Memory) (80–141 GB, ~120 ns)模型和数据存储的主要 GPU 内存空间CPU RAM(512 GB — 2 TB, ~70–180 ns)DDR4每通道的带宽为~25.6 GB/s延迟为~10 纳秒DDR5介于 38.4 到 67.2 GB之间NVMe Storage(Non-VolatileMemoryExpressTB scale, milliseconds)分析GPU相关传递信息的速率importtorchfromtypingimportDictdefbytes_to_gb(bytes_val:float)-float:returnbytes_val/1e9# GPU 内存层级的带宽字节/秒MEMORY_BANDWIDTH{shared_memory:19e12,# 19 TB/s (A100)l2_cache:1.5e12,# 1.5 TB/shbm:1.5e12,# 1.5 TB/s (A100)}defanalyze_memory_hierarchy()-Dict[str,Dict[str,float]]: 分析 GPU 内存层级的性能特性。 result{}formem_type,bandwidthinMEMORY_BANDWIDTH.items():# # TODO 1.1: 计算访问延迟访问 1 KB 数据# latency_ns (1024 / bandwidth) * 1e9# latency_ns(1024/bandwidth)*1e9result[mem_type]{bandwidth_tb_s:bandwidth/1e12,latency_ns:latency_ns,}returnresult# 测试mem_analysisanalyze_memory_hierarchy()formem_type,statsinmem_analysis.items():print(f{mem_type:15s}:{stats[bandwidth_tb_s]:6.1f}TB/s, Latency:{stats[latency_ns]:6.2f}ns)shared_memory : 19.0 TB/s, Latency: 0.05 nsl2_cache : 1.5 TB/s, Latency: 0.68 nshbm : 1.5 TB/s, Latency: 0.68 nsGPU的发展英伟达的GPU架构演进主要是对混合精度矩阵计算与显存带宽的持续需求的提升参考链接GPU架构 ↩︎GPU入门 ↩︎# GPU Memory Hierarchy — How AI Training Actually Works ↩︎