量子计算9 发表于 2022-8-2 18:42

GPU硬件笔记

图形接口

发展史




图形API的发展史

DirectX 11

[*]2009年,Shader Model5.0,支持tessellation和compute shader
OpenGL

[*]4.0支持tessellation
[*]4.3支持compute shader
OpenGLES

[*]2003年,opengles 1.0(a stripped-down version of OpenGL 1.3),固定管线
[*]2007年,opengles 2.0,支持可编程管线
[*]2012年,opengles 3.0,支持mrt、纹理压缩、gpu instancing等
[*]opengles 3.1,支持compute shader
[*]opengles 3.2,支持geometry shader和tessellation shader
Metal

[*]2014年发布
[*]硬件支持特性,参见
渲染管线

实时渲染广义上可以分为四个阶段:应用处理单元、几何处理单元、光栅化和像素处理单元,如下图所示。



实时渲染广义上的分类

应用处理单元主要指CPU的处理,也可以交由GPU的Compute shader来处理。
GPU的几何处理阶段主要包括每个三角形或顶点的处理,它可以细分为如下所示的几个阶段:



几何处理单元的细分

几何处理单元包括两个可选的阶段:曲面细分(Tessellation)和几何处理(Geometry Shader)。
光栅化阶段又可以细分为:triangle setup和triangle traversal。像素处理单元可以细分为:Pixel Shading和Merging。



光栅化和几何处理单元

总结各个阶段如下所示:



GPU渲染管线. 绿色表示可编程模块,黄色表示可配置,蓝色是固定无法修改的。

OpenGL favors the Cartesian system throughout, treating the lower left corner as the lowest-valued element, while DirectX sometimes defines the upper left corner as this element, depending on the context.
PC GPU单元

如下图所示,这里有几个概念:

[*]ALU(Arithmetic Logic Unit),包括移动,对比,分支处理等基本的运算单元;
[*]RF(Register file), 寄存器文件;
[*]L1,L1缓存,通常存在于MP中,表示多个ALU运算器的寄存器的缓存;
[*]L2,L2缓存,基本可以认为L2 cache是介于系统内存和GPU之间,任何图形单元通过L2缓存获取数据,光栅化后的数据也可以缓存在上面;
[*]LDS, local data storage;
[*]TX, Texture Units;
[*]SU, Special Unit,ALU没有包括的特殊计算指令;
[*]MP, Multiprocessor,上述的集合;



ALU和SIMD

Multiprocessor,也称为SIMD,NVIDIA称为Streaming Multiprocessor,Intel称为Execution Unit,AMD称为Compute Unit。
光栅化以2x2像素为最小单位,通过每一组u/v的差值来确定采样的mip级别,大部分的GPU的warp线程数因此设计为4的倍数,更高级别贴图的采样效率更高(内存要求小,缓存命中率高)。
GPU贴图的预读机制,GPU会根据VS输出的纹理坐标,提前预测贴图数据交换至Cache。但是,当PS未按照VS输出的纹理坐标采样贴图时,就会导致失效。
Buffer与Texture有不同的特点:

[*]Buffer,通过LD/ST来处理:
存取单元访问
可读可写
随即访问,包括写入

[*] Texture,通过TEX处理:
贴图单元访问
支持过滤和压缩
贴图预读优化使用上,两者存在一定的区别:

[*]Buffer
较大的结构体数据   
直接寻址访问   
一维的访问
不能承受插值和压缩

[*]Texture
二维或三维访问
数据宽度匹配数据格式
数据可以承受压缩和过滤
通过VS输出的UV进行索引GPU是采用单指令多数据架构(SIMD, single instruction, multiple data),若一个像素的执行过长,就会切换至别的像素执行。这里有几个概念:

[*]线程,Thread,任意一个像素的计算都可以称为线程;
[*]线程束,warps/wavefronts,使用相同程序的线程可以分为同一组,NVIDIA称为Warps,AMD称为Wavefronts。


影响线程束性能的因素主要有两个:

[*]占用率,occupancy,是指一个warp驻留在GPU中,如果一个程序需要的寄存器和内存越小,那么就会有越多的warp驻留在GPU端,则SM更小的概率会空闲,则性能会更好;
[*]条件分支;
占有率越高,它的性能不一定越好,因为它可能频繁的读取内存,导致cache不断被替换。
很玄学的是循环指令,如果循环展开,会导致寄存器数量增加,但是展开的话可能会有更好的指令集并行。
移动GPU单元

ARM架构

Bifrost的整体架构如下图所示,支持32个统一的Unified Shader Engine,每个Shader Engine支持12个线程。



G71 Bifrost架构

单个Shader Engine架构如下图所示,每个Shader Engine包括3个Execution Engine,每个Execution Engine是单位为4的SIMD,相当于有12个线程的能力。为了能隐藏纹理访问的延迟,在单个Shader Engine里面可以保留256个可调度线程。



Bifrost的Shader Engine架构

在Bifrost架构下,顶点数据的处理如图所示。Vertex Shader被分为两个部分,一个部分是Position Shading,确定哪些面在分割的tile上(Binning),另一个部分是Varying Shading,选择传入的参数进行真实的shader运算。



Bifrost架构下的几何数据流

Mali-G76

在可编程的Shader Core内部,不同组件的架构图如下所示:


外部存储与Shader Core的交互可以直接进行或者经过L2缓存,对外部设备的内存访问是非常费电的,一个简单的规则则是:每1GB/s的访问,带来100mW的耗电。尽可能降低带宽也是移动游戏非常关注的点。


varying unit
从架构图中,我们需要关注一个组件varying unit。是用于一些由VS传出至PS的数据的插值。例如,在实际的应用中,我们通常会在顶点着色器中计算好UV坐标,传到像素着色器中进行纹理采样,在像素着色器UV坐标是不同顶点计算出的结果进行插值出来,插值计算就需要一个独立的运算单元。
插值单元有一个32bit的数据运算,那么16bit的运算会比32bit快两倍。推荐尽可能使用medium(16bit)类型的数据,推荐将多个16bit的数据封装成vec2或vec4,有更高的效率,例如vec4就比vec3 + float的组织形式效率要高。
Geometry culling
所有几何模型的顶点需要转化为裁剪空间(clip space)内的坐标后,再传入裁减单元进行处理。虽然有一部分顶点对最终的效果没有任何影响,但是处理它也是需要一定的开销,而干这个事的就是几何裁剪单元。下面显示了几何处理单元的基本流程。


Texture unit
用于纹理采样的处理单元,通常2x2的像素quad是在一个时钟内采样到的,因此bilinear滤波和point滤波模式并没有性能上的差异。
影响纹理采样开销的影响因素是:纹理格式和滤波方式。


例如,最差情况的4x各向异性滤波,三线性采样RGBA16F格式,那么采样的代价就是 4 * 2 * 2 = 16倍普通采样的开销。
移动管线

IMR

如下所示,这是传统的IMR架构(Immediate Mode Rendering)。



IMR架构

该架构在在移动平台上的应用主要存在两个问题:

[*]计算力的浪费
当两次渲染有前后遮蔽关系时,IMR模式因为两次draw命令都要执行,因此会存在经过片断着色后的像素被深度测试抛弃,这样就浪费了GPU的运算能力。当然,目前几乎所有的IMR架构的GPU都会提供Early Z的判断方式,一般是在光栅化里面对图形的遮蔽关系进行判断,提前剔除被遮挡像素,避免它在像素着色器中的计算。

[*]带宽的浪费
渲染命令在执行需要随时读写frame buffer,depth buffer和stencil buffer,这带来大量的内存带宽消耗,在移动平台上面访问片外内存是最消耗电量和最耗时的操作,带宽的消耗带来的结果就是耗电的提高。TBR

在移动端,由于没有属于GPU的独立显示, Framebuffer将会存储在主存中,这时候所有跟Framebuffer 进行的读写操作就需要跟主存进行频繁的数据传输,这样在性能和功耗上都是难以接受的,于是解决办法就是在 GPU上做一块片上Cache,大小虽然无法存储整个Framebuffer,但是足够存储一个Tile 的内容,这样一来所有数据读写都在这块Tile上进行,以达到节省带宽降低功耗的目的。这就是TBR(Tile Based Rendering)架构的基础,如下图所示:



TBR架构

渲染过程有分为两个阶段:

[*]tiling
它将需要渲染的画面分成一个个的矩形区块,例如16x16。模型的顶点经过顶点着色器运算以后会组装成一个个的三角形,这些三角形会被缓存在一个三角形缓存中。如果某个三角形需要在某个区块里面绘制,那么就会在该区块的三角形列表中存一个索引。等一帧里面所有的渲染命令都经执行顶点着色器后,每个tile就会有一个三角形列表,这列表就包含了需要在该tile内部绘制的所有三角形

[*]rasterization and fragment processing
进行光栅化和片段计算。TBR的优点是:节约带宽。
执行raster和Per-fragment operation时不需要反复的访问frame buffer,depth buffer,stencil buffer。这是因为GPU可以把整个tile的frame buffer/depth buffer/stencil buffer保存在一个片上的高速缓存中,这样GPU就直接访问tile,而不需要访问外部内存。这大大减少了内存的带宽消耗,也意味着能耗的降低。TBR的缺点是:需要保存顶点着色器执行后的结果以及每个tile的三角形列表。
这意味着如果场景里面有很多的顶点,那么片上缓存就不可能存下这么多顶点信息和三角形列表,就不得不依靠外部内存来存储,就会有额外的带宽消耗。不过庆幸的是当前的移动3D绘制都不会有太多三角形的场景。一个复杂的模型也就1万多个三角形,因此一个通常的场景大概就是几十万三角形。随着移动游戏越来越复杂精美,模型的复杂程度也会快速上升,这也是TBR架构在未来将会面临的一大挑战。如果在一帧里面有两遍及其以上的渲染,那么就需要使用Framebuffer object来缓存中间结果,这对TBR又是一大性能损耗。根据我们前面的讲解,TBR需要缓冲一帧所有的图元,所有图元执行完毕后才开始raster和Per-fragment operation。在这种情况下,一旦后面的draw命令需要使用到前面渲染生成的结果,那么就不得不在该命令执行前,要求GPU把缓存的所有draw命令都执行完毕,然后放弃当前缓存内容。在极端情况下,例如每次draw都需要读取前一次draw渲染的结果,那么TBR就会直接退化成IMR模式。
每个tile数据会存储在高速缓存上,称为On-Chip Memory。不同的GPU对高速缓存有不同的命名,例如apple gpu的threadgroup memory,adreno gpu的gmem,mali gpu的tile buffer。
在TBR架构下,一些操作的开销就会比较小:

[*]Blending
On immediate-mode GPUs, blending is usually expensive because it requires a readmodify-write cycle to the framebuffer, which is held in relatively slow memory. On a tile-based CPU, this read-modify-write cycle occurs entirely on-chip and so is very cheap. Some GPUs have dedicated blending hardware which makes the blending operation essentially free, while others use shader instructions to implement blending; hence, blending will reduce fragment shading throughput.

[*] Multisampling
In contrast, multisampling in a tile-based GPU can be very cheap, as the multiple samples need only be retained in the on-chip tile buffer, with only the averaged color value written out to framebuffer memory. Thus, multisampling has no impact on framebuffer bandwidth.There are, nevertheless, two costs: firstly, 4 times multisampling will require four times as much tile buffer memory. The second cost for multisampling (which also affects immediate-mode GPUs) is that more fragments will be generated along object silhouettes.

[*] Clear
When it comes to performance-tuning, the most important thing to remember about a tile-based GPU is that the representation of a frame that is currently being constructed is not a framebuffer but the frame data: lists of transformed vertices, polygons, and state necessary to produce the framebuffer. Unlike a framebuffer, these data grow as more draw calls are issued in a frame.You can achieve this with a call to glDiscardFramebufferEXT in OpenGL ES 2.0, glInvalidateFramebuffer in OpenGL ES 3.0, or using the appropriate render pass storeOp settings in Vulkan.
TBDR

该架构最本质的添加了early-z技术,绘制前先做深度检测,减少不必要的绘制,减少像素overdraw的消耗。
PowerVR GPU实现early-z技术的组件名为HSR(Hidden Surface Removal),并申请了专利。TBDR是由PowerVR所提出的说法,严格说,其他移动GPU只能称为TBR。但不代表其它厂商的GPU没有类似的组件。
Mali-T620及以后的GPU都包括FPK(Forward Pixel Kill)的组件优化,现在市面上的GPU设备基本都包括该优化组件。但是,为了最大程度的提高裁剪率,官方建议:

[*]模型尽量从前后往后排序
[*]关闭blend
Adreno 5x及以后的GPU都包含LRZ(Low Resolution Z)支持,现在市面上只有不到1%的机型是adreno 5x以下。
移动设备

Apple系列

NVIDIA Tegra X1 Maxwell GPU

[*]NVIDIA的Tegra K1 GPU的后继者,性能是A8X的两倍。
A8/A8x

[*]A8, iphone 6, iphone 6s, ipad mini4
[*]A8x, iPad Air 2
Apple A9X / PowerVR Series 7XT

[*]ipad pro 12.9/ipad pro 9.7
Apple A9 / PowerVR GT7600

[*]iphone6s/iphone6s plus/iphone se, ipad 2017
[*]14/16 nm
[*]采用PowerVR Rogue架构。
A10 Fusion

[*]iphone7/iphone7 plus, ipad6 2018/ipad7 2019, ipod touch 2019
[*]比A9快40%,能耗是它的2/3
[*]采用PowerVR Rogue架构。
A10x Fusion

[*]ipad pro 20.5 2017/ipad pro 12.9 2017
[*]采用PowerVR Rogue架构。
A11 Bionic

[*]iphone8/iphone 8 plus/iphone x
[*]10nm, 支持metal 2;
[*]apple未经PowerVR授权的第1代集成GPU,采用PowerVR Rogue架构。
A12 Bionic

[*]ipad 10.2 2020/ipad air 2019/ipad mini 5, iphone xr/xs/xs max
[*]4 cores, 7nm, 支持metal 2,比A11 bionic提高了50%的性能;
[*]apple未经PowerVR授权的第2代集成GPU,架构类似于PowerVR
A12x Bionic

[*]ipad pro 11 2018/ipad pro 12.9 2018
[*]7 cores, 7nm, 支持metal 2, 比肩Xbox One S;
[*]apple未经PowerVR授权的第2代集成GPU,架构类似于PowerVR
A12z Bionic

[*]iPad Pro 11 2020/ipad pro 12.9 2020.
[*]8 cores, 7nm, 支持metal 2;
[*]apple未经PowerVR授权的第2代集成GPU,架构类似于PowerVR
A13 Bionic

[*]iphone11/11pro/11 pro max, iphone se 2020
[*]7nm, 4 cores, 比A12 Bionic提高20%性能,降低40%的耗电
A14 Bionic

[*]iphone12, iPad Air 2020
[*]5nm,4 cores,比A12 Bionic性能高30%,比A13 Bionic高10%
PowerVR系列

早期的Apple系列GPU都是沿用PowerVR架构,后面Apple想要自研GPU,将PowerVR玩坏了。
PowerVR的GPU设备

[*]Oppo系列,近年发布的一两千机型;
[*]小米等,不到一千的低端机型;
PowerVR的三种架构:

[*]Rogue
[*]Furian
[*]A-series
PowerVR Series 6XT

[*]PowerVR GXA6850/GX6450/GX6250,apple A8X系列的性能;
PowerVR Series 7XT Series

[*]PowerVR GT7xxx/GT7600,apple A9/A9x系列的性能
Powervr Series 8XE

[*]Rogue架构
[*]GE8100/GE8200/GE8310/GE8300
[*]当前中低端android设备的性能;
Powervr Series8XEP

[*]Rogue架构
[*]GE8430/GE8322/GE8320
[*]当前中低端android设备的性能;
PowerVR Series8XT

[*]Furian架构
[*]GT8540/GT8525
[*]市场上,似乎是绝版的;
PowerVR Series9

[*]包括Series9XM/Series9XEP/Series9XMP/Series9XTP
[*]只有oppo系列的高端机型采用PowerVR GM9446,采用Rogue架构,例如Oppo Reno2 Z/Reno3/Reno3 Pro
Mali系列

ARM的移动端产品:

[*]Utgard架构,支持OpenGLES 2.0,支持的机型有Samsung Galaxy S2,市面上已绝版;
[*]Midgard架构,支持Unified Shader Model和OpenGLES 3.0,包括Mali-T604, Mali-T760, Mali-T880等,市面上还存在部分产品;
[*]Bifrost架构,支持vulkan, OpenCL,等,包括Mali-G71系列;
[*]Valhall架构,最新的移动端架构。
Mali的GPU设备

[*]T系列,比如T628、T880等,通常是2017年的设备
[*]G6x系列,通过是2015年左右快被淘汰的机型;
[*]G71x、G72x系列,比如G71等,2017年的设备,价格大概在一两千左右;
[*]G76x系列,都是现在的高配机型
总结几个结论:

[*]Mali GPU都没有实现用于Compute Shader的On-Chip Shared Memory.
[*]Mali-G系列至少支持Vulkan 1.0和OpenGLES 3.2;
[*]Mali系列占用35%左右,32%是G系列;
[*]Bifrost架构系列:mali-g51, mali-g71, mali-g52, mali-g72, mali-g76
[*]Valhall架构系列:mali-g57, mali-g77, mali-g78
Utgard
Mali-200

[*]65nm
[*]OpenGL ES 2.0 and OpenVG 1.1
[*]已绝版
Midgard
1st Generation Midgard

[*]Mali-400 MP4/MP2/MP1
[*]OpenGL ES 2.0
[*]已绝版
2nd Generation Midgard

[*]T628 MP6/MP4, T604 MP4, T624
[*]OpenGL ES 3.0, OpenCL 1.1
[*]国内外已绝版
3rd Generation Midgard

[*]T760 MP8/MP6/MP4/MP2, T720 MP4/MP2/MP1
[*]OpenGL ES 3.1, OpenCL 1.2
[*]国内市场已绝版,国外市场还存在部分中低端机型;
4th Generation Midgard

[*]T880 MP2/MP4/MP12, T860 MP2, T830 MP1/MP2/MP3
[*]T880MP12对位adreno 530;
[*]T860MP2对位adreno 405;
[*]T830系列支持,支持OpenGL ES 3.2;T830MP3性能相当于T860;T830MP2类似于Mali-450 MP4
[*]OpenGL ES 3.1, OpenCL 1.2
[*]国内市场还有少量低端机型,国外市场还存在部分中低端机型;
Bifrost
G51系列:

[*]Bifrost, 12nm
[*]MP4
[*]OpenGL ES 3.2, Vulkan 1.0, OpenCL 2.0
[*]中低端机型为主
G52系列

[*]Bifrost, 12nm
[*]OpenGL ES 3.2, Vulkan 1.0, OpenCL 2.0
[*]匹敌adreno 618
[*]国内主要是中档机型为主,国外为中高档;
G71系列

[*]Bifrost, 16nm
[*]MP2/MP8/MP20;
[*]OpenGL ES 3.2, Vulkan 1.0, OpenCL 2.0
[*]2016年的顶配,第1代Bifrost架构的GPU,G71MP8性能略优于adreno 530和Snapdragon 821;
[*]国内主要涵盖中低端机型,国外会采用MP20来做高配机型;
G72系列

[*]Bifrost, 16nm
[*]MP3/MP12/MP18
[*]OpenGL ES 3.2, Vulkan 1.0, OpenCL 2.0
[*]第2代Bifrost架构的GPU,G72MP18性能略弱于adreno 540
[*]国内主要涵盖中低端机型(MP3/MP12),国外会采用MP18来做高配机型;
G76系列

[*]Bifrost, 7nm
[*]MP16/MP12/MP10/MP5/MP4
[*]OpenGL ES 3.2, Vulkan 1.0, OpenCL 2.0
[*]性能略优于adreno 640
Valhall
G57系列

[*]Valhall, 7nm
[*]MP6/MP5
[*]OpenGL ES 3.2, Vulkan 1.1, OpenCL 2.0
[*]G57MP6匹配adreno 620和mali-G72MP18;
[*]国内涵盖中高端机型,国外使用的较少。
G77系列

[*]Valhall, 7nm
[*]MP16/MP11/MP10/MP5/MP4 -
[*] OpenGL ES 3.2, Vulkan 1.1, OpenCL 2.0
G78系列

[*]Valhall, 5nm
[*]G78-MP24, 24 cores
[*]Huawei Mate40 Pro
[*]OpenGL ES 3.2, Vulkan 1.1, OpenCL 2.0
Adreno系列

Qualcomm(高通)的GPU系列。
高通的GPU设备

[*]adreno 306, 占比0.19%,2015年的机型;
[*]adreno 308, 占比0.58%,2017年的机型;
[*]adreno 405, 占比0.09%,2016年的机型;
[*]adreno 50x/51x/53x,都是低或极低的机型;
[*]adreno 540,2017年的三千元左右的机型;
[*]adreno 61x/520,大概是现在的三千元左右的机型;
[*]adreno 640/630,大概是现在的顶配机型;
总结几个结论:

[*]adreno的设备占了32%
[*]adreno 630/640/630,占了接近10%
adreno 330/320/308/306/305/304/302

[*]OpenGLES 2.0
[*]国内还存在极少量的低端机型
adreno 430/420/418/405

[*]OpenGL ES 3.1, OpenCL 2.0, Direct3D 11.1
[*]国内还存在极少量的低端机型
adreno 512/510/509/508/506/505/504

[*]OpenGL ES 3.1+, OpenCL 2.0, Direct3D 11.1
[*]国内中低端
adreno 530

[*]14nm
[*]OpenGL ES 3.1+, OpenCL 2.0, Direct3D 11.1
[*]市场上中端偏低,占用量较少
adreno 540

[*]10nm
[*]匹敌Mali-G71MP8, A10
[*]OpenGL ES 3.2, OpenCL 2.0, DirectX 12
[*]中端机型,偏高端
Adreno 619/618/616/612/610

[*]14 nm
[*]OpenGL ES 3.2, OpenCL 2.0, DirectX 12, Vulkan 1.0(待定)
[*]国内外主要是中端机型
Adreno 620

[*]14nm
[*]比618高20%。
[*]OpenGL ES 3.2, OpenCL 2.0, DirectX 12, Vulkan 1.0(待定)
[*]国内外主要是中端机型
adreno 630

[*]10nm
[*]2018年的高端GPU
[*]OpenGL ES 3.2, OpenCL 2.0, DirectX 12, Vulkan 1.1
[*]国内的高端机型,国外较少。
adreno 640

[*]7nm
[*]2019年的高端GPU
[*]性能比630提高了20%,有更多的计算单元
[*]OpenGL ES 3.2, OpenCL 2.0, DirectX 12, Vulkan 1.1
[*]国内外的高端机型
adreno 650

[*]7nm
[*]2020年的高端GPU
[*]性能比640提高了25%,ALUs数比640多了50%,优化Mali-G76 MP16,弱于A13
[*]OpenGL ES 3.2, OpenCL 2.0, DirectX 12, Vulkan 1.1
[*]国内外的高端机型
adreno 685/680

[*]面向Windows笔记本的芯片
[*]DirectX 12
参考

PowerVR Hardware Architecture Overview for Developers
Killing Pixels - A New Optimization for Shading on ARM Mali GPUs
Metal Feature Set Tables
Apple-designed processors
GPU Benchmarks.

RedZero9 发表于 2022-8-2 18:45

谢谢,非常实用。

Arzie100 发表于 2022-8-2 18:53

多向大佬学习[大笑]
页: [1]
查看完整版本: GPU硬件笔记