gpu硬件的结构(「万字长文」GPU渲染管线和硬件架构)

首页教程更新时间:2023-06-05 23:04:23

作者:landonwang,腾讯IEG游戏客户端开发工程师

序言一、GPU渲染管线

1.1 渲染管线简述 所谓渲染管线,就是CPU传送给GPU一堆数据(顶点、纹理等),经过一系列处理,最后渲染得出来一副二维图像。有以下几个阶段。

1.1.1 应用程序阶段

粗粒度剔除、渲染状态设置、准备数据。

我们在游戏引擎中所做的视锥剔除、遮挡剔除等,都是粗粒度剔除,是基于模型级别的。

这一步是在CPU进行的,后面的步骤都是在GPU内部进行的。

1.1.2 顶点处理阶段

顶点着色器、曲面细分、几何着色器、顶点裁剪、屏幕映射。

这里会做背面剔除等裁剪,确保只有真正需要绘制的图元才会进入光栅化。

顶点处理是可编程的(Vertex shader,Geometry Shader和Compute Shader)。

1.1.3 光栅化阶段

三角形设置、三角形遍历、片元着色器。

光栅化引擎会将图元(Primitive)映射为与屏幕像素对应的片元(Fragment)。片元包含每个像素的坐标、颜色、深度、法线、导数、纹理坐标等信息。这个数据经过片元着色器的计算得到最终的颜色值。

像素处理是可编程的(OpenGL中叫做片元着色器,Fragment Shader,DirectX中叫做像素着色器,Pixel Shader)。这里通常是性能瓶颈所在,所以现代GPU做了很多的优化来尽可能避免执行无效的像素处理,比如EarlyZ、隐面剔除等。

1.1.4 逐片元操作

裁剪测试、深度测试、模板测试、混合。

光栅化阶段得到的颜色值通过一些列的测试、混合,最终写入到framebuffer中。

ROP (Raster Operations),是由一个独立的硬件单元来完成的。这个硬件单元的数量和性能限制了GPU每秒写入Framebuffer的数据量。在一些低端机这个阶段也非常有可能成为性能瓶颈,即每秒ROP处理数据量。即便使用最简单的全屏半透明shader,多叠加一两层就会因overdraw而严重降帧,很有可能就是ROP瓶颈。

1.2 IMR: Immediate Mode Rendering

gpu硬件的结构,「万字长文」GPU渲染管线和硬件架构(1)

上图展示了一个非常经典的IMR渲染管线,也是桌面端最常见的GPU架构。GPU会在每个drawcall提交中,按照管线的顺序处理每个图元。

1.2.1 优势:

其优势是渲染管线没有中断,有利于提高GPU的最大吞吐量,最大化的利用GPU性能。同时从vertex到raster的处理都是在GPU内部的on-chip buffer上进行的,这意味着只需要很少的带宽(bandwidth),就可以存取(storing and retrieving)处理过程中的图元数据。

所以桌面GPU天然就可以处理大量的DrawCall和海量的顶点。而移动端GPU则对这两者异常敏感。这不仅仅是GPU性能差异,架构差异也至关重要。

1.2.2 劣势:

IMR是全屏绘制的。当前绘制的图元可能存在于屏幕的任何位置。这意味着我们需要一个全屏的FrameBuffer。这个buffer的内存很大(比如30MB,大小跟屏幕分辨率和渲染目标的格式有关),所以只能放在系统内存(DRAM)中。而在光栅化之后的fragment shading, depth Testing, stencil testing, blending等阶段,都会大量的与系统内存进行交互,消耗大量的带宽。GPU的L1/L2缓存可以缓解这个问题,但是对于移动端,依然是不可接受的开销。

1.3 TBR: Tile-based Rendering1.3.1 为什么要使用TBR架构

对移动端设备而言,控制功耗是非常重要的。功耗高意味着耗电、发热、降频,这会导致我们的游戏出现严重的卡顿或者帧率降低。带宽是功耗的第一*手,大量的带宽开销会带来明显的耗电和发热。

移动端GPU的带宽本来就跟桌面端GPU不是一个量级,又无法像独立显卡一样独占大量带宽,所以减少带宽开销变得异常重要。因此移动端GPU普遍使用的是TBR/TBDR架构。

1.3.2 TBR架构的原理

TBR跟IMR不同之处在于,它并不是基于全屏直接绘制。而是把屏幕分成一个一个的Tile,GPU一次只绘制一个Tile。绘制完毕再将绘制结果写入到系统内存的FrameBuffer中。

TBR架构的绘制过程分成两个部分

第一步,处理所有顶点,生成一个 tile list 的中间数据(FrameData)。这个数据保存了每个图元归属于哪个屏幕上的Tile。PowerVR一个Tile是32x32大小,而Mali则是16x16大小(即将发布的Mali-G710也修改为32x32大小了)。

第二步,针对每个Tile执行像素处理过程(光栅化、片元着色器等),每个Tile处理完毕,将结果一起写入到系统内存中。

1.3.3 优势

TBR架构最大的优势就是减少了对主存的访问,也即减少了带宽开销。每个Tile足够小,其framebuffer是可以做到on-chip memory上的。on-chip memory紧挨着GPU的Shader core,访问速度极快。

不仅仅是fragment shader,depth testing、blending等操作也是在on-chip memory进行的。大幅减少像素处理阶段对系统内存的访问。

还有一个明显优势是,depth buffer和stencil buffer只在Tile处理内部有用。它们是不需要写回系统内存的,这进一步节省了带宽开销。

TBR架构里,一些原本非常昂贵的,消耗大量的带宽的算法,会变得高效起来。比如MSAA (Multi-Sample Anti-Aliasing)。

1.3.4 劣势

GPU要处理所有的顶点,生成tile list,然后才可以进行光栅化。跟IMR相比,这里会有明显的“延迟(latency)”。

生成的这个tile list数据是要存到系统内存中的。这同样会有带宽开销。顶点越多,计算的压力就越大,带宽消耗也会越多。像曲面细分(tessellation),在TBR架构下就异常的昂贵。

所以移动端游戏对顶点数量更加敏感。如果顶点数量过大的话,会导致性能严重下降。

1.4 TBDR: Tile-Based Deferred Rendering

gpu硬件的结构,「万字长文」GPU渲染管线和硬件架构(2)

TBDR和TBR模式基本类似,唯一的区别在于,多了一个 隐面剔除(Hidden Surface Removal) 的过程。就是上图中HSR & Depth Test这个步骤。通过HSR,无论以什么顺序提交drawcall,最终只有对屏幕产生贡献的像素会执行像素着色器。被遮挡的片元会被直接丢弃掉。

不同的GPU有自己的隐面剔除技术,比如PowerVR就是Hidden Surface Removal (HSR),Adreno就是Low Resolution Z (LRZ),Mali就是Forward Pixel Kill (FPK)。其原理和实现各不相同,不过最终目的都是为避免执行无效的像素着色器。

1.5 总结

IMR是桌面端GPU的主流架构。NVIDIA较新的显卡也部分支持了Tile based的特性。不过这个Tile是较大的Tile,而不是像Mali芯片这样16x16的小Tile。

TBR是移动端GPU的主流架构,通过拆分成一个个Tile绘制,减少与主存的交互,进而减少带宽开销。

TBDR一开始专指PowerVR,其光栅化之后并不是立即渲染,而是多了隐面剔除的过程。后来Adreno和Mali也分别提出了自己的隐面剔除方案。所以认为现在的移动端GPU都是TBDR架构也不为过。

推荐阅读 GPU Framebuffer Memory: Understanding Tiling 这篇文章,更加直观的了解不同架构的绘制过程。

二、GPU硬件架构 2.1 GPU和CPU的差异

gpu硬件的结构,「万字长文」GPU渲染管线和硬件架构(3)

这张图展示了CPU和GPU的硬件差异。

CPU核心数量少(计算单元少),每个核心都有控制单元。内存设计上是大缓存、低延迟。

而GPU则恰好相反,计算单元非常多,多个计算单元共享一个控制单元。内存设计上追求高带宽,可以接受较高延迟。

所以CPU中习以为常的分支控制,逻辑运算,在GPU中成了奢侈品。而面对海量数据并发计算的场景,GPU则比CPU快好几个数量级。

CPU和GPU的差异可以描述在下面表格中:

CPU

GPU

延迟容忍度

并行目标

任务(Task)

数据(Data)

核心架构

多线程核心

SIMT核心

线程数量级别

10

10000

吞吐量

缓存需求量

线程独立性

2.2 CPU的缓存体系和指令执行过程

虽然本文主要讲的是GPU架构,不过CPU和GPU有很多地方是相通的,同时又有一些设计方向是相反的。了解CPU可以帮助我们更好的理解GPU的执行过程。

2.2.1 内存的硬件类型2.2.2 CPU的缓存体系

gpu硬件的结构,「万字长文」GPU渲染管线和硬件架构(4)

gpu硬件的结构,「万字长文」GPU渲染管线和硬件架构(5)

2.2.3 CPU指令的执行过程2.3 GPU渲染过程

具体渲染过程,其实就是经典的渲染管线的执行过程。可以跟上一部分的渲染管线流程图对照阅读。推荐阅读 Life of a triangle - NVIDIA's logical pipeline 一文。

2.4 桌面端GPU硬件架构

gpu硬件的结构,「万字长文」GPU渲染管线和硬件架构(6)

上图展示的是NVIDIA Fermi架构的示意图。不同的GPU,架构差异较大,但是大体都包含下列核心组件:

2.5 Shader Core的主要构成单元2.6 GPU的内存结构2.6.1 UMA (Unified Memory Architeture)

gpu硬件的结构,「万字长文」GPU渲染管线和硬件架构(7)

2.6.2 GPU缓存的分类GPU缓存结构

gpu硬件的结构,「万字长文」GPU渲染管线和硬件架构(8)

内存访问速度

内存的存取速度从寄存器到系统内存依次变慢:

存储类型

Register

Shared Memory

L1 Cache

L2 Cache

Texture/Const Memory

System Memory

访问周期

1

1~32

1~32

32~64

400~600

400~600

NVIDIA的内存分类

查资料的时候经常会看到这些概念,但是NVIDIA的内存分类是为CUDA开发服务的,与游戏开发或者移动GPU还是有一些差异的。所以这里只需要简单了解即可。

2.6.3 Cache line2.6.4 Memory Bank和Bank Conflict2.7 GPU的运算系统2.7.1 SIMD (Single Instruction Multiple Data) 和 SIMT (Single Instruction Multiple Thread)2.7.2 Warp 线程束2.7.3 Stall 和 Latency Hiding (延迟隐藏)2.7.4 Warp Divergence

gpu硬件的结构,「万字长文」GPU渲染管线和硬件架构(9)

2.8 其他重要概念2.8.1 Pixel quad

gpu硬件的结构,「万字长文」GPU渲染管线和硬件架构(10)

2.8.2 EarlyZS2.8.3 Hierarchical-z和Tile-based Rasteration

这两个是硬件提供的优化。

2.8.4 Register Spilling和Active Warp2.8.5 Mipmap2.8.6 纹理采样和纹理过滤2.9 从硬件角度理解GPU的执行逻辑2.9.1 GPU中的可编程元件和固定管线元件2.9.2 从硬件角度看EarlyZ2.9.3 GPU核心的乱序执行和保序三、移动平台GPU架构3.1 PowerVR架构3.1.1 PowerVR GPU管线

gpu硬件的结构,「万字长文」GPU渲染管线和硬件架构(11)

3.1.2 PowerVR GPU硬件架构

gpu硬件的结构,「万字长文」GPU渲染管线和硬件架构(12)

gpu硬件的结构,「万字长文」GPU渲染管线和硬件架构(13)

3.2 Mali架构3.2.1 Mali GPU管线

gpu硬件的结构,「万字长文」GPU渲染管线和硬件架构(14)

gpu硬件的结构,「万字长文」GPU渲染管线和硬件架构(15)

3.2.2 Mali GPU四代架构演变

Mali GPU的架构演变非常直观的展示了移动GPU的进化过程。再加上Mali的开发资料比较多,所以这里分别介绍了Mali的四代架构。这里可以和上文介绍的GPU管线和硬件架构的理论形成参考和对照。

Utgard (2007)Midgard (2012)

gpu硬件的结构,「万字长文」GPU渲染管线和硬件架构(16)

Bifrost (2016)

gpu硬件的结构,「万字长文」GPU渲染管线和硬件架构(17)

gpu硬件的结构,「万字长文」GPU渲染管线和硬件架构(18)

gpu硬件的结构,「万字长文」GPU渲染管线和硬件架构(19)

Valhall (2019)

gpu硬件的结构,「万字长文」GPU渲染管线和硬件架构(20)

gpu硬件的结构,「万字长文」GPU渲染管线和硬件架构(21)

gpu硬件的结构,「万字长文」GPU渲染管线和硬件架构(22)

3.2.3 Mali GPU其他技术Forward Pixel KillIDVS: Index-Driven Vertex Shading

gpu硬件的结构,「万字长文」GPU渲染管线和硬件架构(23)

AFBC: Arm Frame Buffer Compression

AFBC是FrameBuffer的快速无损压缩。可以节省带宽,也可以降低显存占用。这个对开发者是无感知的。其他平台也都有类似的压缩技术。

Transaction Elimination

Transaction Elimination也是一种很有效的降低带宽的方法。在有些情况下,只有部分Tile中的内容会变化(例如摄像机不动,一个Tile中只有静态物体)。此时通过比较该Tile前一次和本次的渲染结果的CRC值,可得到Tile是否变化,如果不变,那么就没有必要执行Tile到System Memory的写回操作了,有效地降低了带宽占用。

Hierarchical Tiling

根据图元的大小选择合适的Hierarchy Level的Tile。降低Tiling阶段对主存的读取和写入开销。

Shared Memory3.3 Adreno架构

gpu硬件的结构,「万字长文」GPU渲染管线和硬件架构(24)

Flexable RenderLow Resolution Z3.4 总结四、常见问题的分析与讨论4.1 DrawCall对性能的影响

gpu硬件的结构,「万字长文」GPU渲染管线和硬件架构(25)

4.2 AlphaTest和AlphaBlend对性能的影响4.2.1 桌面平台4.2.2 移动平台4.3 不透明物体是否需要排序

bool hasAdrenoHSR = caps->gles.isAdrenoGpu && !isAdreno2 && !isAdreno3 && !isAdreno4; caps->hasHiddenSurfaceRemovalGPU = caps->gles.isPvrGpu || hasAdrenoHSR;

4.4 PreZ pass/Depth prepass是否有必要4.5 Shader中的分支对性能的影响4.5.1 分支对性能的影响4.5.2 编译器对shader的优化4.5.3 分支的性能隐患4.5.4 multi_compile的副作用

如果不使用if-else,那么另外一个选择就是multi_compile。遗憾的是,使用multi_compile同样会有明显的副作用。

4.5.5 关于分支的建议4.6 Load/Store Action和Memoryless4.6.1 Load/Store Action4.6.2 Memoryless4.6.3 Render Target切换

gpu硬件的结构,「万字长文」GPU渲染管线和硬件架构(26)

4.6.4 避免CPU回读GPU数据4.6.5 Pixel local storage4.6.6 移动平台延迟渲染优化4.7 MSAA对性能的影响4.7.1 MSAA

Family

16x16 Tile

16x8 Tile

8x8 Tile

<= Bifrost Gen 1

128 bpp

256 bpp

512 bpp

>= Bifrost Gen 2

256 bpp

512 bpp

1024 bpp

4.7.2 Alpha to coverage4.8 Shader的优化建议结语

gpu硬件的结构,「万字长文」GPU渲染管线和硬件架构(27)

,
图文教程
相关文章
热门专题
推荐软件
奇热小说
奇热小说
下载
QQ2019手机版
QQ2019手机版
下载
王者荣耀
王者荣耀
下载
百度浏览器迷你版
百度浏览器迷你版
下载
2345浏览器手机版
2345浏览器手机版
下载
网易邮箱
网易邮箱
下载
爱奇艺
爱奇艺
下载
网易云音乐
网易云音乐
下载
WPSOffice
WPSOffice
下载
优酷
优酷
下载
谷歌浏览器(Chrome)
谷歌浏览器(Chrome)
下载
迅雷看看播放器
迅雷看看播放器
下载
UC浏览器
UC浏览器
下载
QQ音乐
QQ音乐
下载
阿里旺旺买家版v9.12.10C官方版
阿里旺旺买家版v9.12.10C官方版
下载
360安全卫士v12.1官方版
360安全卫士v12.1官方版
下载
猜你喜欢
9号仓app
9号仓app
下载
彼得兔小不点儿太太
彼得兔小不点儿太太
下载
佳能FAX-L280驱动软件
佳能FAX-L280驱动软件
下载
我的世界侵入者跑酷地图MODv1.10.2
我的世界侵入者跑酷地图MODv1.10.2
下载
浩沅云商
浩沅云商
下载
霸业神途
霸业神途
下载
范赏
范赏
下载
掌上安琪
掌上安琪
下载
家族之谜有毒的承诺
家族之谜有毒的承诺
下载
万象信用
万象信用
下载
灵云维汉友谊桥电脑版
灵云维汉友谊桥电脑版
下载
饭团生活商家端
饭团生活商家端
下载
宝贝女孩的日常
宝贝女孩的日常
下载
宝可梦属性计算器
宝可梦属性计算器
下载
安泰云
安泰云
下载
泰坦之怒
泰坦之怒
下载