xiangtingsl 发表于 2021-11-29 15:53

GPU图形微架构学习笔记(一)前言

得益于AI和超算上GPU的流行,现在我们能看到很多介绍GPU微架构和CUDA编程的文章了。但是这些文章大多集中于讨论GPU的通用计算功能,很少深入介绍GPU的老本行——图形功能。幸运的是早前发现了一门CMU的课程,里面有一部分专门介绍GPU渲染功能的微架构(可惜公开的只有课件没有视频)。后来持续学习了更多这方面的知识,想写笔记梳理一下GPU是如何设计来高效满足图形绘制需求的。
本系列文章假设读者已经具备一些计算机图形学和计算机体系结构的基础,所以不费过多笔墨在一些基础知识上。想打一下这方面基础的可以参考我总结的学习资料。
最后声明,本系列文章只是个人的学习笔记,主要目的是帮助自己梳理知识加深理解,所以有很多总结和感悟在里面。虽然力求写得清楚明白,但毕竟不是教材,个人时间精力也有限,所以省略了很多细节,讲述方式上也不会太细致。详细内容可以查阅文中所列的参考资料。
目录

第一部分:经典图形渲染管线

[*]光栅化
[*]帧缓冲操作
[*]贴图
[*]曲面细分
[*]任务调度
[*]指令集
第二部分:进阶话题

[*]延迟渲染
[*]网格着色器
[*]可变着色率
[*]光线追踪
[*]超采样
引言

图形任务的本质就是将对场景的描述转化为可以显示的帧缓冲(Framebuffer)的过程。对场景的描述我们可以称为状态,包括顶点、贴图、材质、光源等等。GPU就是这样一个硬件,他在用户设定好这些状态后,计算出一帧(Frame)。而且这个过程必须是实时的,也就是有时间限制,比如在60FPS时,GPU必须在16ms之内得出结果。
需要什么样的状态和得出什么样的结果,这都和GPU的计算方式有关。目前主流的有两套计算方式——光栅化(Rasterization)和光追(Ray Tracing)。一开始我们主要讨论光栅化计算方式时的GPU设计,完了才是光追。因为光栅化的计算量比光追小,GPU出现时都是只能实现光栅化计算,所以对GPU的架构影响最大。
经典的光栅化图形管线如图一所示。其中灰色框是固定管线,黄色框是可编程管线。这个流程由图形编程接口(OpenGL、Vulkan等)抽象出给软件用户,各家GPU厂商都有相似而独特的硬件实现。



图一:光栅化图形管线

图形管线映射到硬件上如图二所示。黄色的可编程阶段由一个统一的执行单元Shader Core运行。管线中灰色的固定阶段在硬件中都有各自的模块实现。计算任务一般由固定管线模块生成,交由Shader Core计算,结果输出到另一个固定管线模块生成新的计算任务继续交给Shader Core计算,重复这个过程最后由Shader Core输出结果给Framebuffer Access模块合成出最后的帧缓冲。其中下方蓝色的模块功能也是固定的,由于都和内存访问相关,而且在图形管线的很多阶段都会用到,不完全属于单个阶段,所以标成蓝色。



图二:图形管线的硬件映射

图形管线其实是一个图形API抽象出来的通用概念,软件开发者用他作为指导,知道这些API的意义。但是在硬件实现上,设计者可以无所不用其极地篡改这个流程来最高效地实现相同的结果。这很像CPU指令集和微架构的关系,比如软件开发者可以认为指令是顺序执行的,但其实CPU微架构的实现可以乱序执行——只要结果相同过程无所谓——为的就是提高IPC。
接下来我们会逐一探究GPU上这些模块的任务特性以及硬件架构。所以不光会看到GPU的微架构有按部就班实现图形管线的部分,也有不按套路出牌的优化部分。而且这些优化深刻地影响了GPU的设计。
参考


[*]^CMU 15-769 VISUAL COMPUTING SYSTEMShttp://graphics.cs.cmu.edu/courses/15769/fall2016/home
[*]^计算机图形学学习资料汇总https://zhuanlan.zhihu.com/p/385837832
[*]^计算机体系结构学习资料汇总https://zhuanlan.zhihu.com/p/358147708
页: [1]
查看完整版本: GPU图形微架构学习笔记(一)前言