23.10.3 Case Study:AMD GCN Vega
AMD的Graphics Core Next(GCN)架构在AMD的多款显卡产品上使用,并且还应用在Xbox One和PLAYSTATION 4上。这里,我们会介绍GCN Vega架构的一些基础的元素,其对于在主机平台上使用的架构来说是一场革命。
GCN架构的一个核心模块就是计算单元compute unit(CU),在Figure 23.28里展示。CU有4个SIMD unit,每个有16个SIMD lanes,即是16个ALU(使用Section 23.2里的术语)。每个SIMD unit有64个执行命令的指令,每个都叫做一个wavefront。一个每个时钟周期里,每个SIMD可以执行一次单精度浮点数运算指令。因为这个架构会在每个SIMD unit上处理一个64个进程组成的wavefront,这个过程全部执行完需要4个时钟周期。注意,一个CU可以同时运行来自于不同kernel的代码。因为每个SIMD有16个lane,并且每个时钟周期可以执行一个指令,所以整个CU的峰值是,(每个CU 4个SIMD unit)X(每个unit 16个SIMD lane)=每个时钟周期64个单精度浮点数操作。相比于单精度浮点数指令,CU可以执行2倍的半精度浮点数(16位浮点数),这对于精度要求不高的情况很有用。注意2个16位的浮点值会被打包进一个32位的浮点寄存器。每个SIMD unit有一个64kB大小的寄存器文件,等于65536/(4*64)=256个寄存器每个thread,由于单精度浮点数用4个bytes,所以wavefront有64个进程。ALU有四个硬件管线阶段。
每个CU有一个指令寄存器(图里没显示),在四个SIMD unit之间共享。需要处理的指令会送往SIMD unit的指令缓冲里instruction buffer(IB)。每个IB有容纳10个wavefront的存储空间,这样可以在SIMD上进行切换来隐藏延迟。这意味着,CU可以处理40个wavefronts。这等同于40*64=2560个进程。FIgure 23.28里的CU 调度器因此可以同时处理2560个进程,他的任务就分发任务给CU不同的单元。每个时钟周期,所有的当前CU上的wavefront会进入指令选择,最多一个指令会被分配给执行端口。CU的执行端口包括了分支branch,标量scalar/向量vector ALU,scalar/vector memory,本地数据共享local data share,全局数据共享global data shader或者输出export,以及特殊指令,就是说每个执行端口几乎只会匹配一个CU的unit。
标量单元scalar unit是一个64位的ALU,由SIMD unit之间共享。它拥有自己的标量寄存器文件和一个标量数据缓冲(未展示)。标量寄存器文件对每个SIMD unit有800个32位寄存器,即是80044=12.5kB。执行过程是和wavefront紧密绑定的。因为它需要4个时钟周期来完全的分配指令给SIMD unit,所以scalar unit只能每4个时钟周期才能服务一个特定的SIMD unit。Scalar unit处理控制流control flow,指针运算pointer arithmetic,和其他的可以在一个warp里的进程之间共享的计算。条件和非条件的分支命令从scalar unit发出,来在branch和message unit上执行。每个SIMD unit有一个单独的48位程序计数器program counter(PC),在lane之间共享。这是够用的,因为所有的lane都在执行同样的命令。对于完成的分支,程序计数器会更新。这个unit可以发出的信息包括debug messages,特殊的图像同步信息special graphics synchronization message,和CPU中断CPU interrupts。
Vega 10架构在Figure 23.29里显示。图片的顶部包括了一个图像指令处理器graphics command processor,两个硬件调度器hardware schedulers(HWSs)和八个异步计算引擎asynchronous compute engines(ACES)。GPC的任务是把图像处理任务分派给图像管线和GPU的compute engine。HWSs的的缓冲对象按照顺序处理,尽可能快的分配给ACEs。一个ACE的任务是向compute engine分配任务。还有2个DMA engines,可以处理复制任务(图里未展现)。GPC,ACEs,和DMA engine可以并行工作并提交作业给GPU,这样提高了利用率,因为不同队列的任务可以交错穿插。任何队列的任务都可以发出,不需要等待其他的作业完成,这意味着独立的任务可以同时在compute engine上执行。ACEs可以通过缓存或者内存同步。他们可以一起支持task graph,所以一个ACEs的任务可以依赖于另一个ACEs的任务,或者图形管线上其他的任务。推荐使用分的更小的计算或者拷贝任务,来进行交错穿插在重度的图形任务之间。
如Figure 23.29可见,有4个图形管线和4个compute engine。每个compute engine有16个CU,共计64个CU。这个图形管线有2个块,即是一个geometry engine和一个draw-stream binning rasterizer(DSBR)。Geometry engine包括了一个几何装配器geometry assembler,曲面细分单元tessellation unit,和一个顶点装配器vertex assembler。另外,还支持一种新的图元着色器primitive shader。Primitive shader的思想是支持更灵活的几何处理和更快的图元裁剪。DSBR结合了sort-middle和sort-last架构的优点,也是分块缓存tiled caching(23.10.2)的目标。图片分割为屏幕空间里的tiles,在几何处理完成之后,每个图元被指定给它所覆盖的所有tile。在一个tile的光栅化过程中,所有数据(比如tile buffer)都被存在L2 cache里,这样提升了性能。像素着色会推迟到tile上所有的几何处理都结束之后。因此,一个z-prepass会在默认执行,像素只会被着色一次。延迟渲染是可以开关的,即对于半透明的几何体会被关上。
为了处理深度,模板值,和颜色缓冲,GCN架构有一个block叫做颜色和深度block(CDB)。他们处理颜色,深度和模板值的读写,另外还有颜色的混合。一个CDB可以使用Section 23.5的通用办法来压缩颜色缓冲。一个差值压缩技术是这么用的:一个像素的颜色值是未压缩的状态,剩下颜色被编码为它的相对值。为了提升效率,tile的尺寸可以通过访问模式动态的选择。对于一个原始256bytes来存储的tile,最高的压缩率是8:1,即是压缩为32bytes。一个压缩的颜色缓冲可以在随后的pass里被当做贴图使用,texture unit会相应的解压和压缩tile,这个操作节省了带宽。
光栅器可以在每个时钟周期光栅化4个图元。CDB和图形管线相连,compute engine可以在每个时钟周期写16个像素。就是说,低于16个像素的三角形会降低效率。光栅器也会处理粗的深度测试(HiZ)和层级的模板值测试。HiZ的缓冲叫做HTILE,可以由开发者来变成,例如提供遮挡信息给GPU。
Vega的cache层级在Figure 23.30里显示。在层级的顶部(图片的最右边),可以看到寄存器,随后是L1和L2缓存。然后,是高带宽内存2 high-bandwidth memory 2(HBM2),这个位于显卡内部,最后系统的内存位于CPU一侧。Vega的一个新特性是高带宽缓存控制器High-Bandwidth Cache Controller(HBCC),在Figure 23.29底部显示。它可以让显存用起来显示最后一层的缓存last-level cache。这意味着如果一次内存访问请求发生了,并且对应的内容不在显存里,即,HBM2,那么HBCC将会自动的通过PCIe总线来获取相关的系统内存的页,并放入显存中。最不常用的页会被置换出显存里,通过一个队列的方式。在HBM2和系统内存之间共享的内存池叫做HBCC内存片段(HMS)。所有的图形模块也通过L2缓存来访问内存,这和之前的架构不同。这个架构也支持虚拟内存(Section 19.10.1)。
要注意所有在on-chip的模块,例如HBCC,XDMA(CrossFire DMA),PCI express,显示引擎display engines,和多媒体引擎multimedia engines,通过一个叫做Infinity Fabric(IF)的内部连接来通讯。AMD的CPU也可以和IF连接。Infinity Fabric可以通过芯片模具来连接各模块。IF之间也是相连的,意味着所有的模块看到的内存里内容的视图都是相同的。
芯片基础的时钟频率是1677 MHz,即是说,最高的计算能力是
FMA和TFLOPS的对应都和公式23.16一样。这个架构是非常灵活的,可拓展的,所以我们也期待会有进一步的配置。
23.11 Ray Tracing Architectures
这部分的知识太过老旧,没有意义。如果有一天,还能相遇,你还想知道,我便再讲与你听罢。
谨以此文献给我曾经的,永远的,可爱的朋友zmj。