GCN,AMD的GPU架构现代化。
随着HD 5000和6000系列的发展,AMD的Terascale(万亿级)架构变得非常具有竞争力。然而在2010年代初,面向通用计算的GPU趋势兴起,AMD并不希望错失这个机会。Terascale的SIMD引擎是ATI的DirectX 9时代GPU中执行单元的远亲。他们可以进行计算,但利用其能力却不一定总能成功。英伟达的Fermi架构具有强大的计算能力,AMD不想毫无抵抗就放弃一块有潜力的市场。
Graphics Core Next(GCN)彻底摒弃了以通用计算的可预测性能为核心的Terascale策略。虽然Terascale的64宽波前仍然存在,但GCN的其他特点却截然不同,以至于它甚至不能算作一个远亲。GCN的指令集类似于典型的CPU或英伟达的Fermi。为了将这些责任转移到硬件上,显式调度信息已被移除。线程内的执行严格遵循标量,摒弃了Terascale从单个线程每周期发出多个操作的能力。
GCN首次亮相市场是在Tahiti芯片上,这是一款采用台积电28纳米工艺制造的352平方毫米芯片。Tahiti配备384位GDDR5接口与显存连接,并升级为与主机的PCIe 3.0链接,使其比AMD之前的Cayman具有更高的片外带宽。自2011年发布以来,GCN衍生架构为AMD的产品提供服务长达十年。从Tahiti到2021年的Cezanne,GCN经历了大量演变,但保留了其可识别的计算单元结构。因此,GCN是历史最悠久的图形架构之一。即使在今天,GCN的DNA仍然延续在AMD面向计算的CDNA GPU中。CDNA线路取消了部分GCN的图形功能,将重心转向FP64,但仍然是一个可识别的GCN衍生产品。
这篇文章将重点关注GCN早期Tahiti和Hawaii的发展情况。这里有来自AMD Radeon HD 7950的数据,它使用了稍微精简的Tahiti芯片。Hawaii是GCN的放大版。它于一年后推出,对最初的 GCN 架构进行了轻微增强,旨在与英伟达当时最大的GPU 竞争。
Hawaii首先推出了R9 290系列,但是会优先考虑R9 390。这是一个稍微精简的Hawaii芯片,配有8 GB的VRAM。
系统架构
GCN的基本构建模块是计算单元(CU)。Tahiti的着色器阵列由32个CU组成,HD 7950启用了28个。每个CU都有一个专用的16 KB向量缓存和64 KB本地数据共享,但与多达四个相邻CU共享一个指令缓存和标量缓存。
计算单元阵列可以由图形命令处理器或异步计算引擎(ACEs)提供,具体取决于工作是在图形队列上提交还是在计算队列上提交。对于计算工作负载,每个ACE可以在每个周期启动一个波前。Tahiti有两个ACE,让它在GPU上每个周期发射两个波前。
对于图形工作负载,GCN的光栅化器消耗由顶点着色器导出的屏幕空间坐标。它们每个时钟可以处理一个基元,每个周期可以写出多达16个像素,因此每个光栅化器每四个周期可以发射一个64宽度的波前。Tahiti有两个光栅化器,让它每两个周期发射一个像素波前。屏幕空间在两个光栅器之间划分,反映了 Cayman 的两个图形引擎的方法。Hawaii使用了四个光栅化器,使其更快地填充着色器阵列。
计算工作负载将其结果写入 VRAM,供未来的内核使用或复制回主机。对于图形,像素着色器导出被发送到渲染后端。Tahiti上的每个渲染后端都有一个16 KB颜色缓存和一个4 KB深度缓存。最终像素颜色被写入内存控制器并绕过二级缓存。与Terascale不同的是,渲染后端与内存控制器分离,并且可以独立于内存总线宽度进行缩放。
GCN的计算单元
GCN的计算单元与Terascale的SIMD大致相当。两者每周期都可以完成64次FP32运算,如果将熔合乘加运算计为两次,则是原来的两倍。然而,AMD已完全重组了这个基本构建模块,将VLIW捆绑打包从图片中提出。计算单元由四个较小的SIMD组成,而不是一个能够发出四次指令的大型SIMD。每个SIMD都有自己的64 KB向量寄存器文件和10项调度程序分区。线程内的执行现在是完全标量的,这意味着CU不能从同一线程的每个周期发出多条指令。然而,如果SIMD的调度程序分区中有多个线程已就绪,并且每个线程的就绪指令都发送到单独的功能单元,那么CU可以每周期发射多达五个指令。
计算单元前端
计算单元(CU)的流水线从32 KB、4路组相联的L1指令缓存中提取指令开始。指令缓存使用64字节行,与CPU上常见的缓存行大小保持一致。一个指令缓存实例可由最多四个相邻的计算单元共享,并可在每个周期向每个计算单元提供32字节。这可能是通过四分组的设置实现的,因此存储器分组冲突可能减少指令带宽。
Terascale 3在多达四个SIMD之间共享一个48 KB的ALU指令缓存,这与GCN有一定的相似性。由于GCN的可变长度指令平均需要较少的存储空间,AMD得以将指令缓存大小削减到32 KB。Terascale 3使用了固定长度的64位指令。一束指令的长度可以根据编译器打包的指令数量和立即值的多少而变化,范围从64位到384位。GCN的指令长度为32位或64位,后面可以选择逐添1个32位立即值。
指令带宽需求可视化
英伟达的Kepler使用8 KB的指令缓存,专用于每个SMX。私有缓存更适合处理Kepler的高指令带宽需求。一个SMX需要每周期至少传输6条指令以满足其192个FP32单元的需求,因为英伟达的每条指令在32个32位元素的长向量上进行操作。使用固定长度的64位指令,根据每条指令的静态调度信息字节计算,Kepler的指令缓存每周期需要提供48或54字节的指令。GCN的计算单元每个周期只需要执行一条指令就可以使其向量执行单元饱和,这既是因为它的向量执行单元较少,也是因为每条GCN指令都在一个64长的向量上操作。
调度和指令发布
一旦指令被获取,它们将保存在一组指令缓冲区中。计算单元的四个SIMD中的每一个都有一个10项的缓冲区,使其能够跟踪来自最多10个独立线程的指令。因此,整个计算单元可以跟踪40个线程(或波前)。对于64宽波前,计算单元可以在运行中执行2560个32位操作。
每个周期,计算单元选择一个SIMD并扫描它的10个线程,以查看是否有准备好执行的线程。GCN可以通过选择多个线程并发布不同类别的指令来实现有限的多发射能力。例如,一个线程的标量算术逻辑单元ALU(Arithmetic Logic Unit)指令可以与另一个线程的向量ALU指令同时发射。理论上,一个计算单元每个周期可以发出5条指令。但是如此高的发布率应该是罕见的,因为工作负载不太可能有来自不同类别的指令的均匀混合。高占用率对充分利用这种多发射策略至关重要。如果SIMD有更多线程可以选择,它将更有可能找到具有正确指令混合的多个线程以实现多发射。
假设达到理论占用率
GCN的策略与Terascale形成鲜明对比,Terascale强调从单个线程的多发射,这给编译器带来了巨大的负担。编译器必须找到在打包成捆时既独立又不过度占用寄存器文件端口的指令。GCN转向使用线程级并行性意味着编译器可以忽略这些硬件细节。英伟达的Kepler采用了一种折中的方法。寄存器组冲突由硬件操作数收集器处理。编译器负责在指令流中为双发射标记成对的指令,但双发射真正起到锦上添花的作用。与Terascale相比,即使不进行多发射,Kepler也能保持更好的吞吐量。
尽管GCN失去了从单个线程进行多发射的能力,但它从一个线程发出请求的次数比Terascale要多。一个Terascale SIMD有16个线程宽,每四个周期可以发射一个捆绑包,但不能连续执行来自同一线程的两个捆绑包。因此,Terascale需要在一个SIMD中至少有两个线程才能实现最大吞吐量。GCN则消除了这一限制,因此SIMD上的线程可以每四个周期执行一次指令。Terascale可以实现更高的单线程吞吐量,但前提是编译器在将指令打包成捆绑包时做得足够好。
在没有寄存器组冲突和依赖延迟的情况下线程的发射速度的粗略设想。每个框代表一个周期。
与此同时,Kepler可以迅速处理单个线程。它使用32宽的波和32宽的执行单元,所以一个线程可以在每个周期发射一条指令。双发射是锦上添花。因此,面对低占用率和有限的线程级并行性,Kepler可以保持相当不错的吞吐量。
寄存器文件
选定的指令从寄存器文件中读取其输入。在GCN中,Terascale SIMD的巨大256 KB寄存器文件被拆分为四个64 KB寄存器文件,每个GCN SIMD一个。GCN的寄存器文件几乎可以肯定是分组结构,但与Terascale相比,应该更少地受到寄存器组冲突的影响。假设仍然是四分组的寄存器文件,GCN可以提供四个输入,以供给可能需要多达三个输入的指令(用于熔合乘加)。如果指令从标量寄存器或指令流中的立即值获取输入,对向量寄存器文件的带宽需求可能会较低。最重要的是,GCN可能有一个操作数收集器,可以在偶尔出现存储器分组冲突的情况下,消除对寄存器文件带宽的需求。
Terascale需要复杂的调度和寄存器分配来实现良好的利用率。每个VLIW通道只能将返回值写回到其对应的寄存器文件分组中,而在读取端的任何寄存器组冲突都可能降低VLIW打包效果。由于SMX的FP32单元没有足够的寄存器文件带宽来为FMA操作提供数据,因此Kepler需要付出更多的努力以实现完全优化。
除了向量寄存器文件外,GCN 计算单元还有一个8 KB的标量寄存器文件。如果程序可以将一些变量存储在标量寄存器中,就可以减少向量寄存器的使用并实现更高的占用率。
执行单元
GCN中的每个SIMD都有一个16路宽的执行单元。常见的FP32操作和整数加法以全速执行,而32位整数乘法和特殊功能以四分之一速率执行。理论吞吐量与Terascale 3相似。但是,GCN不再需要将四条指令打包到每个捆绑包中以饱和计算单元,而是需要至少四个活跃线程来填充其四个SIMD。
Terascale的分支单元被转换为标量ALU。尽管GPU主要是向量处理器,但它们仍然需要处理控制流和地址生成。这些操作通常在一个向量上是常数,所以标量ALU可以卸载这些计算。将这些标量操作移至专用单元有助于减轻向量ALU的负载并提高功率效率。
与Kepler的SMX相比,GCN的计算单元更小,吞吐量更低。为了弥补这一缺陷,Tahiti拥有的计算单元数量是GK104拥有SMX数量的四倍。
Hawaii扩展了着色器阵列,使其可以实现超过5 TFLOPS的FP32吞吐量。然而,作为未来趋势的一个标志,Hawaii的FP64性能落后于Tahiti。GCN的FP64吞吐量可从半速配置到1/16速。Tahiti采用与GCN最初计算设想相一致的1/4速FP64执行进行配置。随着GPU计算在客户端应用中的重要角色逐渐明确,AMD对FP64执行的投资减少。因此,Hawaii采用了更普通的1/8速FP64。但即使以1/8速,AMD的客户端显卡在FP64性能上仍大幅领先于英伟达同类产品。
计算单元数据缓存
AMD重塑了缓存层次结构,以适应通用工作负载,而非仅专注于图形。一个16 KB的4路组相联向量缓存作为计算单元的主数据缓存。它使用LRU替换策略,64B行,并且每周期可以为计算单元提供64字节。Terascale的8 KB只读纹理缓存可以提供相同的每周期带宽,但GCN享有两倍的缓存容量和更低延迟访问。
GCN的矢量缓存也支持写入。L1缓存是直写、写分配设计。它不如大多数CPU中的回写缓存好,但L1仍然可以在写入被传递到L2之前帮助合并写入。
尽管GCN相较于Terascale有了巨大的改进,但Kepler在向量访问方面的延迟仍然较低。AMD希望通过优化部分内存访问以使用标量路径,来缓解这一问题。
分析RX 460上运行的Valheim。RX 460使用北极星,GCN架构的衍生物
标量存储器访问由多达四个相邻计算单元共享的16 KB 4路标量高速缓存提供服务。标量缓存每周期可向每个计算单元传送16个字节,并针对低延迟进行了优化。标量缓存命中的延迟不到50纳秒,这对于此时的GPU世界来说是非常快的。它与Terascale的纹理缓存200+ ns的延迟相去甚远,比开普勒的任何缓存都快,除了它的2 KB常量缓存。
与Terascale相比,GCN在计算单元内的缓存策略既现代又灵活。除了对计算工作负载的巨大改进外,GCN的改变还应有助于图形处理。将纹理缓存容量从8 KB增加到16 KB应该会减轻对芯片级互连的负载,并且较低的延迟意味着GPU在维持良好性能时需要较少运行中的工作。
描绘GK104 Kepler。GK210拥有128 KB的L1缓存/共享内存
英伟达的Kepler架构在缓存策略上既融合了过去的特点,也具备新颖之处,类似于Fermi架构。只读纹理缓存仍然存在。但是Kepler还有一个单独的L1数据缓存,它与本地内存共享存储空间。如果这还不够,Kepler的SMX还具有私有的两级常量缓存设置。常量缓存与GCN的标量缓存在功能上有一定重叠。但与Fermi不同,英伟达的编译器不再尝试为跨波形上的常量内存访问使用常量缓存。您必须使用__constant限定符显式标记内存,以便使用常量缓存层次结构。
结果是,Kepler具有三个独立的数据缓存路径,每个路径都具有足够的容量来独立运行。这种缓存策略让英伟达可以针对特定的工作负载类型专门优化每个缓存。纹理缓存具有极高的96路关联性,并且常量缓存提供了非常低的延迟。但是,为所有内容设置独立的缓存会占用面积。一个SMX拥有146 KB的缓存和本地内存。
用于服务不同内存类型的缓存
相比之下,一个GCN计算单元有80 KB的专用数据缓存和便笺式存储器。如果将16 KB的L1标量缓存分配给4个CPU,这个数字会上升到84 KB。
本地内存
除了全局内存层次结构之外,每个GCN计算单元都有一个名为Local Data Share(LDS)的64 KB软件管理的本地内存。OpenCL将此内存类型称为“本地内存”。LDS的结构与Terascale中的类似,但容量翻倍。它包括32个存储器分组,每个分组每周期可以读取一个32位元素,总共每周期实现128字节的带宽。
来自AMD GCN的技术文档
英伟达的Kepler会根据GK104或GK210变体的不同,从一个64 KB或128 KB的SRAM块中动态分配本地内存和L1缓存存储空间。Nvidia将本地内存称为“共享内存”。与AMD的实现类似,Nvidia的共享内存由32个存储器分组组成,但每个分组宽度为64位。这为Kepler提供了每周期256字节的本地内存带宽,使其更适合处理64位数据类型。
正如之前提到的,当在LDS内进行指针追踪时,GCN的表现出奇地差。Tahiti的表现比Cayman(Terascale 3)差。Hawaii的表现更好,但仍远不及英伟达同时代的架构。
AMD的优势在于通过LDS同步线程。内置在LDS中的整数原子单元有助于加速这些操作。而英伟达的Fermi和Kepler架构没有相应的功能。它们的共享内存非常快,但是在原子操作的性能方面仍有很大的改进空间。
二级缓存
与大多数GPU一样,GCN具有跨GPU共享的L2缓存。L2缓存有助于处理L1未命中,并分为独立的分片以提供高带宽。每个分片具有64 KB或128 KB的缓存容量,并连接到一个内存控制器通道。Tahiti和Hawaii似乎都使用64 KB分片。每周期一个分片可以读取64字节,因此Tahiti的L2应具有每周期768字节的带宽。因此,在925 MHz的Boost频率下,HD 7950理论上具有710 GB/s的L2带宽。在1 GHz时,R9 390具有1 TB/s的L2带宽。
Terascale具有类似的L2分片配置,每个分片为64 KB,每周期提供64字节。然而,Terascale的L2只是一个只读纹理缓存。GCN的L2采用了现代化的写回设计。写回缓存只在行被逐出时将写操作向下一级传播,从而吸收写带宽。此外,GCN的L2分片可以处理原子操作。Terascale上的原子操作将在单独的、较小的读写缓存中处理,并且性能较差。
关于GCN记忆子系统的评论
Terascale的缓存是基于图形处理构建的。着色器程序不需要向内存中写入太多数据,它们的输出被发送到专用的片上缓冲区。顶点着色器会输出到参数缓存和位置缓冲区,而像素着色器会将其输出发送到ROPs(渲染输出单元)。
根据Terascale ISA(指令集架构)手册,每个着色器程序的输出都通过专用的片上缓冲区进行传递,以尽量减少VRAM(显存)写入。显然,计算程序无法从这些特殊缓冲区中受益。
计算程序被硬挤进这种现有结构。如果让Terascale在OpenCL内核中从内存获取数据,编译器会发出顶点获取或纹理采样子句。主要的L1/L2缓存是只读纹理缓存,因此写带宽表现不佳。
GCN使缓存层次结构现代化,缓存设置类似于GPU上现在有的布局。主要的L1/L2缓存得到写入支持。所有缓存中的标准64字节缓存行,可以轻松实现与CPU的数据共享。它们还是虚拟地址,只要缓存命中,TLB(转换后援缓冲)未命中就不可能发生。缓存延迟和带宽数字相较于Terascale都得到了显著改善。在28nm制程时代,GCN使AMD在带宽方面取得了很大的领先优势。这与40nm制程时代相反,那时Fermi通常比Terascale显卡具有更高的带宽。
随着AMD继续迭代GCN,缓存层次结构得到了进一步的现代化。在GCN第三代中,只读标量缓存获得了写入支持。Vega在GCN第三代之后问世,并将命令处理器和渲染后端置于L2之前。这有助于减少L2刷新并提高写带宽。
来自AMD关于RDNA架构的演示
尽管经历了重大变革,但Terascale的部分遗留特性仍然存在。四个计算单元共享指令和标量缓存,有助于减少芯片上用于缓存的面积。这与Kepler的方法形成了鲜明对比,在Kepler中,设计师全力打造每个SMX的缓存。部分原因在于,像与同时代的英伟达竞争产品一样,GCN保持了非常高的计算密度。
计算性能(VkFFT)
VkFFT在多个不同的GPU计算API中实现了快速傅里叶变换(FFT)。它是一个现代且目前仍在维护的项目,2010年代初期的GPU在完成完整基准测试时可能会遇到困难。但是每个平台都可以通过前几个子测试,有足够的数据展示GCN的计算潜力。VkFFT可能受内存限制较大,而GCN的大容量内存总线使其表现出色。
HD 7950在与GTX 680的对比中表现出色。Hawaii架构的R9 390扩大了该优势。VkFFT还会输出预估的带宽数据,这些数据展示了庞大的512位GDDR5总线所能带来的性能。
等一下,Oland使用128位DDR3总线在这里是怎么回事?
遗憾的是,Tesla K80无法参加Vulkan基准测试,因为无法让Vulkan在该云实例上工作。幸运的是,OpenCL几乎可以在所有设备上运行,而且VkFFT也可以使用它。
当大型GCN与大型Kepler对决时,GCN极高的计算密度和高内存带宽使它在每个子测试中保持领先。GK210的384位总线被Hawaii的512位总线超越。最重要的是,Hawaii的频率也更高,略高于1 GHz。Tesla K80的运行频率约为875 MHz,因为GK210芯片必须适应150W的功耗范围。
VkFFT的预估带宽数字再次展示了GCN在带宽方面的优势。Tesla K80的每个GK210芯片只有240 GB/s的理论带宽,而R9 390的理论带宽为384 GB/s。VkFFT在RDNA 2上进行分析时并不支持缓存,RX 6900 XT的4 MB L2几乎没有任何命中。K80和R9 390很可能处于类似的情况。
关于图形性能的一点说明
对于某些计算工作负载,GCN的计算密度和高内存带宽可以让它在与英伟达Kepler架构的竞争中大幅领先。然而,在图形负载方面可能是另一番情况。GCN的大规模着色器阵列在具有较长持续时间的大规模工作负载上表现出色。一些图形工作负载,比如全屏像素着色器,就属于这一类。然而,较小的工作负载可能会让Kepler占据优势。
处理简单几何图形的顶点着色器等小型工作负载对任何GPU来说都具有挑战性,但GCN比Kepler的表现更糟。
相对于计算,Kepler在固定功能图形硬件上花费更多的面积。GK104拥有四个光栅化分区,每个分区有两个SMX。如果Kepler保持与Fermi相同的光栅化吞吐量,每个光栅化器每时钟周期可以处理一个图元并输出8个像素。为了实现Kepler完整的计算吞吐量,每个SMX需要为其四个调度分区中的每一个分配至少一个波。在没有小三角形吞吐量损失的前提下,损失光栅化器可以在32个周期内创建访问Kepler所有计算潜力所需的最小像素工作量。Kepler每个SMX调度分区的全部占用(每分区16个波)至少需要512个周期才能达到。
Tahiti有两个光栅化器来为一组32个计算单元(CU)提供输入,即每16个计算单元有一个光栅化器。每个光栅化器每时钟周期可以处理一个图元,并在每四个周期内创建一个64宽的像素工作波。与Kepler的SMX类似,GCN的计算单元需要为每个SIMD分配至少一个波,以实现完整的吞吐量。光栅化器需要256个时钟周期来实现这一点。达到最大占用率需要2560个时钟周期。
来自AMD的GDC 2018的演示. GK104 Kepler的“SE:CU”比例式1;2
Hawaii通过增加到四个光栅化器来改善这种情况。对于每个光栅化器的11个计算单元,第二代GCN可以在176个周期内实现每个SIMD一个波,以及在1760个周期内实现完全占用。然后,像Vega 64和Fury X这样的更大型GCN实现再次扩展了着色器阵列,将SE(Shader Engine)与计算单元的比例恢复到1:16。
放大在6900 XT上运行的瓦尔海姆的RGP配置文件,显示了光栅化器填充着色器阵列时的延迟。同样的情况也适用于GCN,但GCN应该更糟
每线程性能是另一个问题。图形渲染可能涉及具有有限并行性的序列。与Terascale相比,GCN可能提供更为稳定的每线程性能。但是,Kepler可以为单个线程提供更多的执行资源,这在具有大量小型绘制调用的序列中非常重要。
放大观察在6900 XT上运行的Cyberpunk 2077剖析,显示具有有限并行性和短周期的小型绘制调用。在这类序列中,Kepler应该优于GCN。
因此,高端GCN GPU通常在较高分辨率下表现良好。渲染更多像素意味着更多的并行性,这使得线程启动速率和每线程执行时间相较于GPU的整体吞吐量变得不那么重要。
写在最后
GCN是一个完全现代化的架构。该设计的调度、执行单元布局和缓存设置与RDNA 3和英伟达的Ada Lovelace具有更多共同点,而不像其直接前身Terascale 3。与最近的GPU一样,GCN的设计在计算和图形方面都具有很好的定位。然而,AMD侧重于计算的转变并未取得成功。与英伟达的生态系统优势相比,GCN的通用设计并没有太大意义。CUDA在OpenCL之前成熟,并附带一套预优化的库。更糟糕的是,GPU计算在消费者领域并未蒸蒸日上。游戏性能仍然是最重要的。
在2010年代初至中期,光栅化图形继续主导游戏市场。AMD在Hawaii中扩展了GCN的工作分配硬件,但英伟达在Maxwell和Pascal中取得了巨大的提升。GCN在性能和能效方面仍然难以与之匹配。
AMD希望您编写计算着色器。
虽然这对2012年的AMD来说可能没什么慰藉,但现代趋势已经证实了GCN设计的合理性。固定功能图形硬件仍然重要,但游戏已逐渐趋向于使用更多的计算。光线追踪是一个广为人知的例子。光线追踪基本上是一种计算工作负载,它不使用光栅化器。然而,即使没有光线追踪,计算着色器也在现代游戏中悄然发挥着更大的作用。现代设计采用了GCN设计的一些元素。RDNA保留了标量数据路径,并使用了类似的指令集。英伟达在其Turing架构中加入了标量路径(称为统一数据路径),并将其保留在后续设计中。
如今,得益于更高的显存容量,HD 7950比GTX 680更具可用性。GCN的设计也更倾向于大型、长时间运行的内核,因为这可以让GCN的大型着色器阵列更好地发挥作用,同时减轻了光栅化器快速启动波前来填充它的压力。这使得Tahiti更有能力应对新游戏带来的更高着色器工作负载。R9 390也是如此。几个月前,我收到了一位朋友的朋友不再使用的这款显卡,但这并不是因为这款显卡性能不足。相反地,这款R9 390为他效力的时间太长,以至于散热膏都已经干掉,导致性能极度降低。
审核编辑:刘清
全部0条评论
快来发表一下你的评论吧 !