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

DX12渲染器开发(2):GPU硬件架构介绍

[复制链接]
发表于 2022-11-9 20:19 | 显示全部楼层 |阅读模式
上一篇文章写出来之后,就一直在肝DX12的初始化了,由于初始化涉及的东西很多,还没有整理出来,所以这一篇暂时先不写关于初始化的内容。(说好的一年365篇,我已经少了一篇了,回头初始化一起补上)
而我在查资料的时候,由于这个DX12把很多底层的东西直接开放给开发者,这样有很多的问题都和GPU底层有点关系,看文章时,大哥就动不动扯一句GPU什么什么架构,什么什么SIMD,寄存器了。
卧槽整的我看的不是很明白,因为我本身没有学过计算机组成,CPU的那套就不了解,GPU也更别提了,所以想要把这方面补一下。
还是先推荐一篇硬核文章:
这篇文章最开始,我是完全看不懂的,各种术语,但是当我转了一大圈之后,补充了各种概念基本上能看个差不多了。
然后还有五篇:
这个和GPU相关,但是没那么难,讲的没那么深,如果对渲染管线不是很熟悉的朋友可以去看看,上边是英文版,里面打开之后,他给了一个中文的链接,大家自行选择。
下面开始正题:
一、CPU和GPU

0、基础概念

其实计算机显示出画面,本质就是计算颜色,然后告诉屏幕,屏幕亮了,就这么简单。
在最开始的时候是没有GPU这个玩意的,它CPU也能进行计算,所以一样让屏幕显示画面,正常上色。但是吧,随着逐渐发展,CPU计算颜色这件事并不是很合理,CPU并不是那么擅长,这是和它本身的结构决定的。那这时候就针对显示画面计算,设计了一个GPU出来,这个专门干图形处理的,让他去作为CPU的助手,CPU专心去做一些复杂计算,逻辑处理等任务。
那现在我们考虑两件事情,显示画面相关的计算到底有什么?而为啥GPU擅长,CPU不擅长?
通过这俩问题,来初步理解这两个的架构。
总的来说这个画面相关计算的特定就是:算的多,但是又不难。拿个游戏做例子就好了,如今的游戏场景已经变得异常复杂,三角面数上万,而且为了更加精细的画质,颜色相关的各种计算,这些叠加起来,总之很多。不难是因为,从顶点着色的变换也好,像素着色器的颜色计算也好,都是一些比较基础的运算,没有很多涉及逻辑判断之类的。
所以说对于这种任务,要想在有限资源下,有限时间内,快速完成这些任务。我们应该找大量的人来算,由于资源有限,找一些计算力不是那么强的人来算就好了。没错就是这么设计的。
下面就开始看看他们到底什么叫人多:


首先CPU也好,GPU也好,他们是一个计算的地方,计算肯定要有人负责,同时也肯定需要一些内存用来存储,还有一些控制指挥大家计算的,所以他们都会有多个部分组成。
Control那个就是用来控制的,Cache就是用来存储的,DRAM也是存储的。这些我们后面详细说,先来看管计算的,就是那个绿色的ALU。
这里体现了一个占比,就是GPU的ALU比较多,也就对应着人多。
人多干得快我们现实很好理解,但是机器是怎么实现的呢?这就得讲一些概念了。
1、异步



我这里就直接大量引用文章了,上边简单来说:这个只看名字同步异步,我觉着说的并不是很好理解,就直接看解释,做两件事A和B。
假设干A的时候,在干一半时,你需要等一段时间才能继续干,而如果是同步,那就一个个来,先A后B,A干了一半,需要等一会,他就在那原地等,等一会继续A,A完了再B。
而异步就是先A,然后需要等A一会,这个等待的时间去执行B,这样这段时间就不会白白浪费在等待上,执行B之后再回来A已经可以继续干了。
2、并发和并行

下面讨论的是多个任务下的话题,CPU接到了多个任务,他是怎么处理的,这里有两种方式:
并发:同一时刻,有多个任务处于进行中,但是不一定是执行中,就是他可能是执行了一半,暂停执行了。可能有的在执行,有的就暂停了。
并行:就是同时执行,比如CPU两个核,一个核跑A任务,另外一个核跑B任务。这俩就是同时执行的。
那么他俩关系:并行一定允许并发。

发现一个文章,听通俗的,下面截图:






如果没有这块知识背景,一定看看上边完整的文章。
他说到了CPU时间片,就假设这个时间片是1毫秒。并发的意思:就假设有两个沙漏,CPU处理他们就很简单,处理一下就会让沙漏往下漏一点沙子,不处理就不会漏。那么由于时间片是1s,CPU对A沙漏处理1ms,他会漏1ms,然后1ms时间到了之后就轮换到处理B了,这时候A就不漏了,然后B开始漏。B完了之后就换到A。
试想一下,你如果同时看这俩沙漏,我们感觉上应该是他俩同时漏的吧!因为他俩都是每个1ms漏一次,但是这间隔太小了,我们很难感知的到。
但是实际他俩没有任何一个时间段是同时漏沙子的。但是试想一下,如果CPU的时间片长达1分钟,这下子你是不是就可以看到他俩完全不同时了,就是因为CPU处理的足够快,时间片也短,所以我们以为两个沙漏是同时执行的。
那么并行就很简单,我的CPU就是牛逼,直接左手一个沙漏,右手一个沙漏,同时处理他俩,他俩同时往下漏。
这两个并发与并行都是实现异步的方法。关于异步的好处:


好处也很好理解,因为异步其实就是灵活一点,一件事从开始做,他可能需要等一会才出结果才能继续往下走,那你就异步一下玩会手机,过一会就出结果了,在往下执行这件事。而同步就死脑筋,他就一直等,保持等的状态,直到结果出来,再继续往下。
一个较好的文章:
同步和异步的区别及优缺点_rookieLink的博客-CSDN博客_异步缺点

然后我们上边说的任务在执行,其实任务是啥,他不就是程序么,运行着的程序。而这些运行着的任务就可以是线程或者是进程。


上边的火车就是在执行任务,而他的任务可以分别分配给每一个车厢去执行。

这块的概念等到后面多线程渲染,多显卡渲染的时候是必须要理解的!
回到最开始的CPU和GPU话题,这里先说一个core(核心),记住一点,我们说想要程序并行执行,必须要多个核心的出现,一个核心就相当于仅一个机器,他只会做一个任务。
上边我们说CPU可以一次让一个沙漏漏沙子,又说了他牛逼,可以让俩沙漏漏沙子,其实这俩说法差别就在CPU的核心数上。前面只有一个核心,后者有俩核心。
而核心的数目,就是我们平时所说的CPU是多少核的。
而并发我们微观上来看,只有一个核在干活,所以就算这个核满负荷,他也只是一个机器的产出。假设单位时间产出1g沙子,它无论怎么搞,俩沙漏加一块单位时间内就漏了1g。
并行就不一样了,它单位时间内就2g了。而我们GPU想要的是什么,单位时间内干的活多,也就是沙子漏的多,所以它就可以加大量的核,上边的ALU并不是核,但是他是组成核的组成成分。因为他有大量的核,所以ALU就占比很多。
现在应该明白了GPU大概是要朝着什么方向设计了。
那CPU其实也是可以有多核的啊,但是CPU本身一个核能力就很强,可以算很复杂的东西,所以要想涉及出来多个,就会有很多的限制,你没办法搞出来那么多,所以说CPU现在核心的个数也就维持在几十个,这都算多的了。
但是别忘了GPU他执行的任务很简单啊,所以每一个核也不需要很复杂,所以可以造出来很多的核,这也就保证了为啥GPU可以设计那么多核。他俩大致关系就如下:


明白了GPU的多核是怎么回事,看来是时候去看看他们的物理结构是怎么样的,也就是那堆硬件知识。
二、GPU硬件架构

1、基础概念介绍



先从这张图说起。
上边仔细看图,最上有一个chip,什么是chip?
其实也就是CPU的个数。一个电脑基本上就一个,然后再往里可以看到很多的core,也就是CPU的核,Cache也好,Register也好,这都是和内存相关的,待会再说,然后有一个SIMD,还有一个控制的。
这个控制的,你就简单理解成发号施令的,写的程序变成计算机指令之后交给他,它控制着内存和计算来去执行这些指令。对于SIMD,简单来说,他就是计算的。他还有些特殊,叫做单指令多数据。也就是控制的那个人发一个指令,我们这边不是拿着一个数据去处理,而是多个数据,都按照这个指令处理。
这有啥好处,你想想很多的计算他不都是相同的计算方式,只是数据不同么,而这样不必多个指令同时发出去了。就省了一些的开销。实现一个指令,多个数据并行执行。(这里《游戏引擎架构》写的是并行)
SIMD

这是CPU,我们大致了解一下即可。多补充一个,和SIMD相关的有一个:


开头向往大佬文章中也提到了,而且写了一个例子,非常容易懂:


而实际上GPU,它有一个叫SIMT的东西,这个得待会再说,涉及到一些需要补充的东西。
GPC/TPC/SM/SP

然后到了GPU,Chip不说了,他是一样的概念,然后有一个计算单元,什么是计算单元:


这里看上边的几个词应该很熟悉,他有自己的控制单元,寄存器,缓存和指令流水线。这个指令流水线就对应于我们软件层面上的渲染管线。
先撇开这些不说,计算单元他说了个streaming multiprocessor,简称SM。从这个SM开始,了解一下下面的这种图:



图片来自向往大佬文章

这玩意千万别怕,我刚开始,卧槽,直接给我劝退,全是英文字母,完全不懂,但是掌握技法之后,这类图都一个样。
首先这个你可去看开头向往大佬的文章,他梳理了一个GPU架构发展历程,这也就是说明,GPU他那个框架不是一成不变的,随着需求啥的,他一直在改进,升级的,所以你会看到很多的类似的图,而且这里是Nvidia的,其他显卡也是类似。


我们GPU最关心的就是并发,多核,计算的那些事,所以我们从这里入手,它GPU他是一层套一层的,这里术语很多啊,大家先记住他们的字母就好了。
我们先忽略其他的,只看计算部分,一个GPU他又很多的GPC,而这个GPU从上图我们看出有6个。
一个GPC,他有很多的TPC,上图中有6个。
然后一个TPC,它里面有很多的SM,上边有俩。好到这里,和我们之前说的计算单元streaming multiprocessor(SM)的概念就联系起来了。
从SM来看,我们CPU实际包含了很多的SM,但是SM还不是我们所说的核,都说GPU牛逼到上千个核,但是这里SM从数上看他也不是。
我们扒开SM:


SM随着架构也是不断变化的,但是基本上类似,找了一个看着容易理解的架构。
我们看到有一个东西叫做Core,有一个放大了的图,叫做CUDA Core,他还有一个名字叫做SP,streaming Process。



https://blog.csdn.net/asasasaababab/article/details/80447254

这里SP,就是单个核心了,就看懂上边大致执行一些浮点整数的计算,还有一些控制啥的功能,了解到着就行了。
这里由于架构逐渐在发展,所以他中间术语上还是有一些变化的,大家在看向往那篇文章时注意下。比如SM,到后面成了SMX,SMM。



2、软件层面概念

上边讲的都是物理层面他是怎么划分的,那么下面我们讲一下在软件层面上的概念,同时说一下程序怎么在这个GPU上跑的。
软件层面上有几个概念:
CUDA编程



1.1 CUDA编程模型之线程分配 - 简书 (jianshu.com)
上边是Gird->Block->Thread这么个层级关系,他和我们之前讲过的SM,SP硬件上是有一些关联的,说关联之前先把他们介绍一下。
首先这里理解我们得从根上来,从我们熟悉的东西来,不然凭空出来这仨概念有点难理解。你可以看到它左边有一个Kernel,这个Kernel是啥:


GPU计算 -- GPU体系结构及CUDA编程模型 (hustcat.github.io)
卧槽,说了什么CUDA程序,这个CUDA老是出现,搞他:
CUDA程序就是CUDA编程编出来的程序,哈哈~~,那么什么是CUDA编程呢?
这个CUDA编程,其实就是和我们控制台编程,Win32编程,Android编程类似的概念,都还是用语言去写程序,然后他特殊的点在于它的程序跑起来是在CPU上搞点事情,GPU那边也搞点事情。从下面写的程序可以大致看出:
CUDA学习笔记1:第一个CUDA实例 - 爱国呐 - 博客园 (cnblogs.com)
以及下文中提到的:
CUDA基础(1):操作流程与kernel概念 - hankeyyh - 博客园 (cnblogs.com)


大致了解了之后,这个程序会在GPU上允许一个或者多个kernel,也就是允许一段程序。然后再看他和右边三个的关系:


我们之前说过线程,就是执行中的任务。结合上边grid就是一大坨的线程,然后他又细分一个个的block,Block里面也是一坨线程,也就是这坨任务就要在刚刚的核上进行计算。
现在来说这些和SM/SP之间的对应关系。


CUDA01 - 硬件架构、warp调度、指令流水线和cuda并发流 - 猫猫子 - 博客园 (cnblogs.com)
核函数就是我们的Kernel,调度器就认为是一个控制的人,他来控制任务(线程)和执行任务的机器(核)怎么个分配。
我们得到了一个对应,Block会在SM上,而一个Block里面有很多的线程,SM里面有很多的SP,SP上就跑线程,这俩就对应起来了。因为一个SM的SP并不是很多,上边也说了十来个,但是线程数我们可以开很多,所以多个线程,少量的核,他这里采用的方式就是和CPU时间片执行的方式一样的。
这里还有一点要说的,


SIMD数据并行(三)——图形处理单元(GPU) - 信号君 - 博客园 (cnblogs.com)
我们上边说了一个调度,也就是把block分配给SM,但是上边说的那个调度吧,他并不具体,他只是说那些块给到哪个SM,并没有对某个SP进行指挥。这个调度器,就是图片说的线程块调度器。
然后还有一个warp调度器,先说一个概念叫做warp,上边说的流式多处理器就是streaming multiprocessor,SM,SM对应一个或者多个块的进程,这些进程又被细分,分成warp,每一个warp里面有32个线程。
这32个有些特殊,他们之间执行任务时,执行的指令是一样的,但是数据不一样,也就是单个指令,多个线程,鼎鼎大名的SIMT。
之前提过这四个字母,是时候解释一下他了:
SIMT




https://www.cnblogs.com/timlly/p/11471507.html#431-simd%E5%92%8Csimt

说的已经很明白了,他是多个线程,下面补充一下他和SIMD之间的区别:


SIMD与SIMT区别 - 知乎 (zhihu.com)
说白了这个SIMD还是单个线程,单个线程同时进行多个计算。


这是SIMT的解释。最后这个文章也给出了一些总结:


当然上边是CUDA的程序,我们DX程序在GPU上执行的部分,也是类似的。
说到这里基本的组件交代了,组件上怎么执行,怎么调度大致了解了。其实还有一个重要话题没说,就是内存层面的,这个是一个非常重要的话题,一会cache,一会register,一会global memory,一会又constant的,妈的乱七八糟,所以下面梳理一下:
3、GPU内存结构

GPU存储结构概述(及与Shader关系猜想) - 知乎 (zhihu.com)
感谢这个大哥的文章,它帮我理清了老些memory,我下面在自己梳理一下,按照上边讲述的逻辑。


首先是这个,我们其实最应该先理清楚他们之间的层级关系,让我们对这一坨有一个overview,然后再讨论他们的速度啊,位置等。也就是先说scope的部分。


卧槽,这个太给力了,把之前的Grid,block那一坨给连接起来了。
我们从最里面往外看,一个线程,它有着自己的Register和Local Memory,然后块内的线程之间有着Shared Memory。
Constant Memory,Texture Memory和Global Memory,这三个都是Grid级别的,也就是这一个程序独一份的。
然后我们再说,上边的表格,chip其实就是是否是再GPU上,这个不详细说了。关于读写的,会涉及到每一种memory的详细使用,我们到后面文章再探讨。
然后是速度和cache是否支持,这俩其实和一个内存层级有点关系,说之前先来说一下cache的概念,顺带着buffer一起说:
buffer和cache

首先buffer是一个内存上的区域,我们程序读入肯定是要输入输出的,中间夹个计算,而计算速度要比输入输出的快,这样输入输出就会拖慢计算的速度,想了个办法就是先把磁盘等数据输入先加载读取到内存上,然后计算,输出也先输出到内存上,然后再往设备上输出。这样能够对充分利用计算速度,不会被拖慢。
而上边读取到的内存上的区域或者输出到内存上的区域都可以成为缓冲区。
而对应有一个词cache,叫做缓存,他是CPU的一部分,首先硬盘读取是最慢的,虽说先弄到了内存上(其实硬盘文件就是你几十个G的游戏文件,而游戏打开时需要加载一会,就是把几十个G中需要用的一部分给弄到内存上,然后计算,各种操作输出出来,就是游戏运行的画面。)但是内存的读取还是慢的。
这个CPU太特么强了,算的太快,内存往他那里给数据的速度,或者它输出数据运输到内存的速度,还是比不上它计算的速度。
所以就让内存的东西,再以同样的思路往上搞一层或者多层,也就是cache,具体操作就是:在CPU内部搞一个cache,先把内存弄到这个上边,然后CPU再来拿,因为他俩更近了,而且cache的设计上也有所不同,所以速度就快了。
如果还不行,那就再近点,然后就出现了一级一级的cache。如下:


缓冲区(buffer)与缓存(cache) - 哦摩西罗伊 - 博客园 (cnblogs.com)
CPU,内存,硬盘,缓存,缓冲区_啦啦不要熬夜啊的博客-CSDN博客_每个cpu的缓冲区空间
什么是缓冲区(buffer),什么是缓存(cache)_顺其自然~的博客-CSDN博客_buffer cache
缓冲(BUFFER)、缓存(CACHE)和内存(RAM)_S_o_l_o_n的博客-CSDN博客_buffer和内存
大家可以详细参考下上边的东西。


这是几个内存结构之间存储量和存储速度的关系。这里大概就回答了上边存储速度的区别,主要是看数量级就好了。
上边说到了很多计算速度,存储速度,这里涉及到几个小东西,也说一下:
性能指标

这几个词,在查资料的时候,大佬也是动不动就扯的,性能嘛,还是比较关心的问题的。
吞吐量:这个就是计算速度的体现,具体的,可以认为是单位时间能够算多少运算。
带宽:单位时间内能够传输多少数据。
位宽:和上边类似了,是一个时间片下传输数据的位数,即bit。101001。
这里看吞吐量和带宽就好了,吞吐量牛逼,说明你算的快,但是如果带宽跟不上,数据传输不快,就会导致你的计算性能无法全部发挥出来。所以说光一个牛逼还不行。
GPU核心性能指标_Charles Ren的博客-CSDN博客_gpu算力衡量标准

回到内存的话题。现在还有表格中的最后一栏,也就是是否有cache,额,说这个之前,我们再多扯一个话题,因为平时还有俩字母,也会经常看到:
DRAM和SRAM



SRAM VS DRAM - 知乎 (zhihu.com)


SRAM和DRAM区别_Chauncey_wu的博客-CSDN博客_sram和dram
说的很清楚了,他俩是物理上的一些区别,然后使用时体现出来的区别主要是读写速度。总之我们的cache这种用SRAM比较多,而内存使用DRAM比较多。
额,还有一个VRAM,是和显存有关的一个概念。
继续我们的话题cache:


注意这里的L1和L2,就是对于上边表格中的三个:Constant Memory,Texture Memory和Global Memory进行的一个快速缓存。当然上边图只是只写了一个Global Memory,其他俩也类似:


另外向往大哥,他还给出了一个图:


我们这里考虑的都是左边的情况,也就是分离式架构,了解一下即可。哦,有一个PCI-e,这个字母有点印象哈,这个是CPU和GPU之间在物理上是怎么连接的,怎么交互的。
另外关于每一种内存的详细解读:




GPU存储结构概述(及与Shader关系猜想) - 知乎 (zhihu.com)
再放一遍链接,这个大佬已经写的很完美了,我就不罗嗦了,这部分,现在从硬件结构上了解一下,等到后面DX程序资源存取的时候详细探讨。
一些概念补充



上边是向往大哥,文章中列的一些词,现在我想,大概除了红色圈中的那些你应该都很熟悉了,我们现在把剩下的几个补充一下。
有一个更全面的补充,推荐给大家:
GPU架构相关术语 - 知乎 (zhihu.com)
FPU,这个我们之前提过一个图:


其实这里的FP unit就是FPU,也就是浮点数计算单元。
补充说一下,INT Unit那个就是ALU。也不知道为啥不直接写ALU,大佬文章就这么说过:


NVIDIA GPU的一些解析(一) - 知乎 (zhihu.com)
SFU


他的位置出现在右边,也就是每一个SM里面的东西,他是:Special Function Unit,特殊函数单元,执行一些cos,sin或者对数等运算,由于这类运算并不多,所以不需要每一个core里面都有,一个SM里面有几个就够用了。
Load/Store Unit


上边说的个数,大家不用管,和具体的架构有关,这个是在线程访问内存时起作用的。
ROP




注意,我们所说的ROP是前者,也就是render output unit,渲染输入单元
要想知道这个是在GPU哪里的,就得搬出来最牛逼的一张图了,还是从向往大哥那拽过来的:


刚看文章时,看到这图没给我吓死,这尼玛是人看的????一堆没有逻辑的字母,配上两句解释也看不明白。
但是现在我想大家应该不是这反映了,起码现在图片的下半部分都很熟悉了,还有右上角调度相关的,SM结构也都差不多了解了。当然那个if分支的还没说。
还有右上角和管线相关的也没说。而这个ROP,自然也就是管线中的一个阶段了。所以下面先补充一下这个if和else的东西。
if-else:

其实主要原因是Single Instruction的问题,不论是SIMD还是SIMT,由于所有的计算走的指令是一样的,那么到了if分支,因为数据是不同的,所以可能走的是不同的分支,最后导致有的很快执行完了,有的很慢才完成,但是他们是一直single Instruction的,最快的也得等其他慢的完成了这次指令的执行,才能再往下一起执行剩下的指令。
这里有些解释可能涉及到俩术语:一个是lock-step,就是几个人同时执行一个指令的行为,就是他们lock-step,也很形象。还有一个masked out,就是先执行完了的线程,得等待还没有执行的线程,那么他们的ALU计算就被浪费了,这就叫他们被mask out了。

三、渲染管线硬件流程

首先声明,向往大哥,这块讲的很清楚了,我这里只把一些我自己学习时,觉着不是那么容易理解的点,解释一下,其他的我拽他的图。


额,忍不住多说一句,上边的Host Interface,大家如果注意看图的话,他是出现过的:


多说一句,他旁边有个黄色的Giga Thread,这个是一个调度器,我们之前说过两个调度,复习一下:


这里的第一个就是上边的Giga。


接下来的操作就和左下角这一小块有关系了,这个我们之前并没咋提起过。


这里也说了关于if分支的东西。
关于第七点:
由于指令也是需要被读取的,所以这里读取的时候也是每个线程读取一部分,然后合并,得到整个warp需要执行的指令,所以这相比不合并的时候少了很多的指令读取,而所以这就让加载存取单元少了很多。


cuda - 用于 Kepler 架构的加载/存储单元 (LD/ST) 和特殊功能单元 (SFU) - IT工具网 (coder.work)


这里说的,其实要先明白之前讲过的一个调度概念,我们说过,一个SM中的SP个数也就是core个数,其实并不多了,但是可以创建的线程很多,也就是说线程要比core多,这时候我们说是采取CPU时间片的方式来进行执行。
6里面也说了warp之间才是独立的,所以控制时间片的时候是对warp为单位进行控制的,让warp执行时间片,也就是让它里面的32个线程同时在core上执行。
那么如果说A warp遇到了内存加载,这时候可能需要等很长时间,那么赶紧让他让出来那些core,让别的B warp上去执行。这样就克服了内存读取延迟。
这时候A下来了,他是在自己的寄存器里面蹲着,等待内存加载。而上边的矛盾怎么理解呢?
首先我们想要让内存加载的快一些,其实就多加寄存器(因为寄存器更快,之前说的内存慢就加了cache,cache越多越好,这个寄存器就是一个更牛逼的cache,更快。)。
上边说的是多加用来和内存交互的寄存器,而寄存器总数有限,warp分配到的寄存器就得减少,那减少了warp就少了,你虽然寄存器多点了,但终究还可能有内存延迟的,那延迟再来的时候,你想要找空闲的warp,可能都没了,因为warp数量少了啊。
所以说对于内存交互的寄存器,和warp的寄存器数量的控制,是需要有一个平衡在里面的。


关于这个Tile,其实就是三角形被网格化之后的每一个小格子,里面存储插值的数据:


Tile-Based Rendering学习笔记 - 知乎 (zhihu.com)


剩下这些就比较简单了。上边32个像素一组,还是一个线程处理一个像素的。

到此,关于硬件架构的知识就差不多了,我看向往大哥,还写了很多的更深的话题:


    • 四、GPU运行机制
    • 4.1 GPU渲染总览
    • 4.2 GPU逻辑管线
    • 4.3 GPU技术要点

      • 4.3.1 SIMD和SIMT
      • 4.3.2 co-issue
      • 4.3.3 if - else语句
      • 4.3.4 Early-Z
      • 4.3.5 统一着色器架构(Unified shader Architecture)
      • 4.3.6 像素块(Pixel Quad)

    • 4.4 GPU资源机制

      • 4.4.1 内存架构
      • 4.4.2 GPU Context和延迟
      • 4.4.3 CPU-GPU异构系统
      • 4.4.4 GPU资源管理模型
      • 4.4.5 CPU-GPU数据流
      • 4.4.6 显像机制

    • 4.5 Shader运行机制
    • 4.6 利用扩展例证

  • 五、总结

    • 5.1 CPU vs GPU
    • 5.2 渲染优化建议
    • 5.3 GPU的未来
    • 5.4 结语

由于本篇文章,目的是基本从零来补充硬件架构的知识,然后核心目的是做到能够读懂向往大哥的那篇文章。所以到这里也就差不多了。
深入GPU硬件架构及运行机制 - 0向往0 - 博客园 (cnblogs.com)
深入GPU硬件架构及运行机制 - 知乎 (zhihu.com)
大佬的知乎和博客园链接都放在这里了,大家现在再去看这个文章,基本上会舒服很多了。

关于这部分的内容,并没有完全补完,剩下的日后再做补充吧!

reference:
大多数上边列出来了,方便大家阅读的时候看原文扩展。还有几个,参考比较多的:
SIMD数据并行(三)——图形处理单元(GPU) - 信号君 - 博客园 (cnblogs.com)
CUDA01 - 硬件架构、warp调度、指令流水线和cuda并发流 - 猫猫子 - 博客园 (cnblogs.com)
Nvidia GPU架构 - Cuda Core,SM,SP等等傻傻分不清?_asasasaababab的博客-CSDN博客_显卡sm单元是什么意思
Cuda 学习教程(五):GPU架构-Sp,sm,thread,block,grid,warp_Bryan Zhang的博客-CSDN博客

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2024-11-24 21:54 , Processed in 0.095603 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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