Hacker News 中文摘要

RSS订阅

GPU读取内存时会发生什么 -- What happens when a GPU reads memory

文章摘要

本文深入探讨了GPU读取内存时SASS指令(全局加载)在RTX 4090硬件上的执行路径,通过时序实验逆向工程分析CUDA向量加法内核的底层运作机制。

文章总结

好的,这是根据您的要求,对原文主要内容进行的中文重述,保留了关键细节,并删减了与主题无关的冗余内容。


标题:当GPU读取内存时会发生什么

本文深入探究了GPU在执行一个简单的向量加法内核(c[i] = a[i] + b[i])时,一条关键的SASS指令(全局加载指令 LDG.E)是如何在硬件中完成一次完整的内存读取旅程的。文章以NVIDIA RTX 4090显卡为例,通过时序实验来逆向工程这一过程。

旅程起点:从线程束到L1缓存

  1. 指令发射:一个线程束(warp)中的32个线程同时执行 LDG.E 指令。该指令需要从寄存器 R4R5 中读取一个64位的虚拟地址。
  2. 地址获取:从寄存器文件读取这256字节(32个地址)的地址信息,耗时约1个时钟周期。
  3. 地址合并:加载/存储单元(LSU)将指令和地址发送给“合并器”(coalescer)。合并器负责将32个线程各自请求的4字节数据,合并成对L1缓存的最小请求单位——32字节的“扇区”(sector)。由于线程访问的是连续的地址,合并器最终发出4个连续的扇区请求,总计128字节,这正好是L1缓存的一行(cache line)。
  4. L1缓存查找:请求进入L1缓存。L1缓存是4路组相联的,通过虚拟地址的哈希值决定数据行属于哪个组(set)。每个组有4个槽位,每个槽位存储一个128字节的缓存行及其标签(tag)。如果标签匹配且所需扇区有效,则命中,数据返回,耗时约15.4纳秒(40个时钟周期)。由于是首次加载,请求会“未命中”(miss),需要继续向下查找。

旅程中继:地址转换与L2缓存

  1. 地址转换:L1未命中后,请求必须从虚拟地址转换为物理地址。SM内部的TLB(转译后备缓冲器)保存了最近16次地址转换的结果。首次加载会TLB未命中,需要从更高级的转换缓存中获取映射,耗时约4.4纳秒(11个时钟周期)。转换完成后,请求带着物理地址和所需扇区掩码离开SM。
  2. 穿越交叉开关:请求通过芯片内部的交叉开关(crossbar)网络,被路由到36个L2缓存切片(slice)中的一个。切片的选择由物理地址的复杂函数决定。
  3. L2缓存查找:每个L2切片是16路组相联的,包含1024个组。请求的物理地址通过哈希决定其所属的组。由于数据是首次加载,L2缓存同样未命中,耗时约127纳秒(330个时钟周期)。随后,请求被转发到12个内存控制器中的一个(每3个L2切片共享一个控制器)。

旅程终点:DRAM内存

  1. 内存控制器:每个内存控制器负责与一个GDDR6X DRAM芯片通信。DRAM芯片内部有两个独立的通道(channel),每个通道有16个存储体(bank)。每个存储体是一个二维阵列,包含65,536行(row)。
  2. 行激活与列读取:为了服务请求,内存控制器首先发送一个“激活”(activate)命令,打开目标行,将整行数据(1 KiB)传输到行缓冲区(row buffer)。然后,发送4个“读取”(read)命令,从行缓冲区中取出所需的4个32字节列(column)数据。激活新行的成本远高于在同一行内连续读取。
  3. 数据传输:读取到的256位数据通过PAM4信号编码,经由16个数据引脚串行化传输回内存控制器。

返回之路

  1. 数据回填:数据从内存控制器写回到对应的L2切片行中,然后通过交叉开关返回给发起请求的SM,并填充到L1缓存的对应槽位。
  2. 写入寄存器:最终,数据被写入所有32个线程的 R4 寄存器中。这清除了指令发射时设置的依赖屏障,使该线程束重新变为可调度状态,准备执行后续的加法指令。
  3. 总耗时:一次完整的L1未命中、L2未命中的DRAM访问往返耗时约255纳秒(660个时钟周期)。

总结:文章通过追踪一条简单的加载指令,详细描绘了数据从寄存器、L1缓存、TLB、交叉开关、L2缓存、内存控制器到DRAM芯片,再返回的完整路径。这个过程涉及地址合并、缓存查找、地址转换、跨芯片路由和复杂的DRAM时序。虽然单个线程束在此期间被挂起,但GPU通过同时处理大量其他线程束的请求,实现了高吞吐量。文章附录还提供了用于测量这些延迟和逆向工程缓存、TLB及DRAM结构的实验方法和具体函数。

评论总结

根据评论内容,主要观点和论据总结如下:

观点一:硬件简化与AI优化的可能性 - 评论1指出,芯片制造商长期倾向简化硬件并依赖软件优化,但过去数十年未成功。如今AI能快速微调内核,或许简化硬件可行,但TPU/NPU可能过于局限。 - 关键引用:"For a long time, the chip manufacturers had an inclination to simplify the hardware... Maybe simpler hw will work this time?"(评论1)

观点二:文章深度与可理解性 - 评论2和4认为文章内容深奥,难以理解,但激发了深入学习的兴趣;评论5则高度评价文章,类比为“每个程序员都应了解的内存知识”。 - 关键引用:"I don't even understand a third of content there... Giving me inspiration to dive deeper."(评论2);"VERY good article, reminds me on 'what every programmer should know about memory'"(评论5)

观点三:技术细节与局限性 - 评论6提醒,并非所有GPU都完全按此方式工作;评论7建议,若NVIDIA文档不足,可参考AMD ISA。 - 关键引用:"YMMV; not all GPUs work exactly like this"(评论6);"Or you could just use the AMD isa"(评论7)

观点四:内容缺失 - 评论3指出文章未提及PCIe BAR(基地址寄存器)相关内容。 - 关键引用:"Ctrl+F PCIe BAR.. nothing."(评论3)

总体而言,评论对文章的技术深度和启发性给予肯定,但指出其可理解性不足、部分细节缺失,并提醒硬件差异。