找回密码
 立即注册
查看: 428|回复: 2

GPU硬件笔记

[复制链接]
发表于 2022-8-2 18:42 | 显示全部楼层 |阅读模式
图形接口

发展史




图形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年发布
  • 硬件支持特性,参见[3]
渲染管线

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



实时渲染广义上的分类

应用处理单元主要指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
参考

[1] PowerVR Hardware Architecture Overview for Developers
[2] Killing Pixels - A New Optimization for Shading on ARM Mali GPUs
[3] Metal Feature Set Tables
[4] Apple-designed processors
[5] GPU Benchmarks.

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2022-8-2 18:45 | 显示全部楼层
谢谢,非常实用。
发表于 2022-8-2 18:53 | 显示全部楼层
多向大佬学习[大笑]
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2025-5-1 09:05 , Processed in 0.137678 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表