找回密码
 立即注册
查看: 410|回复: 0

百人计划2.9GPU硬件架构概述

[复制链接]
发表于 2022-3-31 15:20 | 显示全部楼层 |阅读模式
问题目录

开头问题回答
1、GPU是如何与CPU协调工作的?
CPU和GPU各自有独立的缓存和内存,它们通过PCI-e等总线通讯。

2、GPU也有缓存机制吗?有几层?它们的速度差异多少?
寄存器→L1缓存→L2缓存→GPU显存→系统显存、一共五层、



速度差异


3、GPU的渲染流程有哪些阶段?它们的功能分别是什么?
顶点着色器:顶点变换、裁剪、屏幕映射
光栅化:三角形设置、三角形遍历、像素着色器
输出合并:测试和混合

4、Early-Z技术是什么?发生在哪个阶段?这个阶段还会发生什么?
提前深度测试。光栅化阶段。裁剪、背面剔除

5、SIMD和SIMT是什么?它们的好处是什么?co-issue呢?
SIMD单指令多数据,一条指令可以处理多维向量(一般是四维向量)
SIMT单指令多线程,SIMD的升级版
co-issue是为了解决SIMD运算单元无法充分利用的问题(会找到V2和V2或者V1和V3的向量合并成V4给SIMD处理)。

6、GPU是并行处理的么?若是,硬件层是如何设计和实现的?
是。GPU中实际有多少这些单元(每个GPC有多少个SM,多少个GPC ......)取决于芯片配置本身。例如,GM204有4个GPC,每个GPC有4个SM,但Tegra X1有1个GPC和2个SM,它们均采用Maxwell设计。SM设计本身(内核数量,指令单位,调度程序......)也随着时间的推移而发生变化,并帮助使芯片变得如此高效,可以从高端台式机扩展到笔记本电脑移动。

7、GPC、TPC、SM是什么?Warp又是什么?它们和Core、Thread之间的关系如何?



GPC、TPC、SM、Warp、Cpre关系

Warp Scheduler内有很多个小Warp(线程束)。
Core就是平时说的核,双核、四核等,就是每个CPU上的核数,Thread(超线程)就是每个core上的硬件线程数

8、顶点着色器(VS)和像素着色器(PS)可以是同一处理单元吗?为什么?
顶点着色器和像素着色都是在同一个单元中执行的(在原来的架构中vs和ps的确是分开的,后来nv把这个统一了)vs是按照三角形来并行处理的,ps是按照像素来并行处理的。

9、像素着色器(PS)的最小处理单位是1像素吗?为什么?会带来什么影响
像素着色器上面的最小工作单元:2x2的像素块。
为什么
1、简化和加速像素分派的工作。
2、精简SM的架构,减少硬件单元数量和尺寸。
3、降低功耗,提高效能比。
4、无效像素虽然不会被存储结果,但可辅助有效像素求导函数。
影响:也会激化过绘制(Over Draw)的情况,损耗额外的性能

10、Shader中的if、for等语句会降低渲染效率吗?为什么?
会。例如当前的指令是if(true)的分支,但是当前线程的数据的条件是false,或者循环的次数不一样(比如for循环次数n不是常量,或被break提前终止了但是别的还在走),因此在shader中的分支会显著增加时间消耗,在一个warp中的分支除非32个线程都走到if或者else里面,否则相当于所有的分支都走了一遍,线程不能独立执行指令而是以warp为单位,而这些warp之间才是独立的。
总结:写shader一般不用循环if、for

11、如下图,渲染相同面积的图形,三角形数量少(左)的还是数量多(右)的效率更快?为什么?



渲染效率

左,右边处理的数据更多(处理顶点数据、处理光栅化、着色、测试混合)
12、GPU Context是什么?有什么作用?
上下文(Context)。同一个Core的多个ALU共享一组Context。越多Context可用就越可以提升运算单元的吞吐量。

13、造成渲染瓶颈的问题很可能有哪些?该如何避免或优化它们?
GPU是什么

GPU全称是Graphics Processing Unit,图形处理单元。一开始是专门绘制图形和处理图元的芯片,后来加入了其他功能。
显卡内包含GPU(核心),散热器、通讯元件、与主板和显示器连接的各类插槽。



GPU是什么

GPU物理架构



GPU物理架构



总结了一下老师的PPT

N卡发展史(重点技术)

2010:第一个完整计算架构。
2014:全局光照技术、多帧采样抗锯齿MFAA、动态超级分辨率DSR等等技术。(画质就是这个时候突变)
2018:配备光线追踪处理器。



N卡发展史

Gpu微观物理结构

NVidia Tesla架构(2008初代)




NVidia Tesla

NVidia Fermi架构(2010)




NVidia Fermi

NVidia Maxwell架构(2014)

在处理单元上有很大的提升


NVidia Turing架构(2018)




NVidia Turing



NVidia Turing

GPU构架的共性

GPU层级非常多并且部件雷同,有点像一个公司有非常多部门,每个部门还有重复的组,所以GPU的运行是高度并行的,互相不会受到影响。



GPU构架的共性

GPU核心组件结构包含关系




GPU核心组件结构包含关系

GPU逻辑管线

一、1.首先把CPU数据打包准备好,2.经过剔除,3.通过图形API发出drawcll指令,4.指令到达驱动程序,驱动程序检查合法性,5.把指令放入GPU可以读取的Push buffer中(可以读取的意思是 drawcll被显卡驱动翻译成GPU可以理解的代码)。
二、驱动程序经过调用flush指令后,驱动程序把Push buffer的内容发送给GPU,GPU接受命令,并通过前端处理命令。(上一步是储存,这一步是处理)
三、把提交上来N个三角形(的顶点),分配给几个GPC同时处理(图上的那四个东西)



GPU逻辑管线1应用阶段

四、SM的Poly Morph Engin(黄色区域)通过三角形索引取出三角形数据,即图中的Vertex Fetch(黄色第一个模块)。
五、Warp Scheduler内的32个Warp处理顶点数据对于左边橙色,右图是工作Warp Scheduler内部
六、七、八、描述warp的工作细节



GPU逻辑管线2顶点着色器阶段

九、1.顶点着色器的运算结果会被Viewport Transform模块处理,Viewport Transform模块的处理就是NDC后被映射成屏幕空间的过程,2.在屏幕外的图元会被裁剪,3.准备光栅化,4.GPU用L1缓存和L2缓存来进行顶点着色器和像素着色器的数据通信。
十、在像素阶段把三角形划分变成按显示的像素划分。(不确定是不是这一步从连续变离散)



GPU逻辑管线2光栅化阶段

十一、SM的Attribute Setup保证顶点着色器的数据插值后再像素着色器上是可以读取的。
十二、1.GPC上的raster engines接收三角形,2.然后负责三角形的像素信息生成,3.同时处理背面剔除和Early-Z剔除。
十三、8个2×2的像素块是像素着色器上面最小的工作单元(32个像素线程)。
如图中的三角形覆盖了三个像素点,但是实际上GPU读取的是3个2*2的像素点(32个线程中的12个线程)去计算,这样我们容易获得DDX(右像素-左像素)和DDY(上像素-下像素),用来计算mipmap层级,减少带宽。
我不太懂,如果一个线程表示一个方格的话,我横着数到着数一个一个数都有36个而不是32个线程。
十四、计算像素着色器



GPU逻辑管线3像素着色器阶段

十五、像素着色器计算了颜色值和深度值,一个ROP内部有很多个ROP单元(父单元与子单元),在ROP单元中可以进行深度测试、模板测试、透明度测试、最后在帧缓存区混合。



GPU逻辑管线4输出合并

Early-Z(提前深度测试)

在以前的渲染管线是在像素着色器之后执行深度测试,这样增加了很多计算(GPU计算了这个像素的颜色、测试他透明度、模板值,最后告诉GPU这个像素没过深度测试,这样就前面白算了)。
Early-Z是把像素的深度测试在片元着色器之前计算,减少了部分计算。但是透明度测试方面的问题也会出现。现代的GPU会判断片元着色器中的操作是否和提前测试发生冲突,有冲突就会禁用深度测试。
Early-Z失效的原因:

1开启Alpha Test:由于Alpha Test需要在像素着色器后面的Alpha Test阶段比较(DX的discard,OpenGL的clip),所以无法在像素着色器之前就决定该像素是否被剔除。
2开启Alpha Blend:启用了Alpha混合的像素很多需要与frame buffer做混合,无法执行深度测试,也就无法利用Early-Z技术。   
3关闭深度测试:Early-Z是建立在深度测试开启的条件下,如果关闭了深度测试,也就无法启用Early-Z技术。
4开启Multi-Sampling(多重采样):多采样会影响周边像素,而Early-Z阶段无法得知周边像素是否被裁剪,故无法提前剔除。
5以及其它任何导致需要混合后面颜色的操作。




Early-Z

SIMD和SIMT

SIMD

SIMD单指令多数据,一条指令可以处理多维向量(一般是四维向量)。
可以更快的处理向量



SIMD

SIMT

SIMT单指令多线程,SIMD的升级版



SIMT

co-issue

之前SIMD处理的是四维向量,co-issue把1维和3维数据合并,2维和2维合并,这样SIMD可以专心处理四维向量。



co-issue

CPU与GPU对比

CPU是个领导,给GPU发命令,计算能力一般。
GPU是个员工,计算能力非常强大



CPU与GPU对比

CPU-GPU异构系统

第一种:分离式架构,CPU与GPU都有单独的缓存和内存,通过PCL-e通讯。
也就是说PCL-e的性能决定数据从传输,如果PCL-e是低带宽和高延迟会造成性能瓶颈。
常用于PC
第二种:耦合式架构,CPU与GPU共享缓存和内存。
常用于PS4、智能手机。(也可以理解,总不能手机上随时插着显卡和CPU吧)
存储管理:

分离式结构:CPU 和 GPU 各自拥有独立的内存,两者共享一套虚拟地址空间,必要时会进行内存拷贝。
耦合式结构:GPU 没有独立的内存,与 CPU 共享系统内存,由 MMU 进行存储管理。



CPU-GPU异构系统

GPU资源机制

内存架构:寄存器→L1缓存→L2缓存→GPU显存→系统显存
存取速度从左到右
从第二图看出shader读取L1、L2比较快,到纹理、常量、全局缓存非常慢。



GPU资源机制

GPU内存分布在在RAM存储芯片或者GPU芯片上,他们物理上所在的位置,决定了他们的速度、大小以及访问规则
访问速度:寄存器→共享→纹理、常量→全局、本地



GPU内存位置和访问速度

GPU资源管理模型(分离式架构)




GPU资源管理模型(分离式架构)

分离式架构的CPU-GPU的数据流程图



分离式架构的CPU-GPU的数据流程图

shader的运行机制

在执行阶段,CPUshader二进制指令 经过 PCI-e 推送到 GPU。
GPU→多个Channel→各个Core
一个Core→4条指令流→32个并发程序片元



shader的运行机制

汇编代码转译二级制指令过程
汇编代码 从上到下 被 ALU 逐条 获取 并 解码为二进制指令,然后执行二进制指令。



汇编代码转译二级制指令过程

SIMT特定指令代码




SIMT特定指令代码

GPU Context和延迟
使用SIMT技术后,导致Core在访问到纹理、常量缓存、和全局内存时会非常卡顿。
使用越多的Context越可以提升运算单元的吞吐量。



GPU Context和延迟

逻辑管线层面和硬件执行层面总结:

1.顶点着色器和像素着色都是在同一个单元中执行的(在原来的架构中vs和ps的确是分开的,后来nv把这个统一了)vs是按照三角形来并行处理的,ps是按照像素来并行处理的。

2.vs和ps中的数据是通过L1和L2缓存传递的。

3.warp和thread都是逻辑上的概念(软件,所以他们是虚拟的),sm和sp都是物理上的概念(硬件所以他们在图中都有存放他们的位置)。线程数≠流处理器数。
参考:

本帖子中包含更多资源

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

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-5-9 10:14 , Processed in 0.141222 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

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