美文网首页
计算机组成原理--GPU

计算机组成原理--GPU

作者: kirito_song | 来源:发表于2020-01-07 17:35 被阅读0次

    算是读书笔记吧

    极客时间--深入浅出计算机组成原理


    GPU 的历史进程

    GPU 是随着我们开始在计算机里面需要渲染三维图形的出现,而发展起来的设备

    90 年代中期,随着个人电脑的性能越来越好,PC 游戏玩家们开始有了“3D 显卡”的需求。
    那个时代之前的 3D 游戏,其实都是伪 3D。比如,大神卡马克开发的著名Wolfenstein 3D(德军总部 3D),从不同视角看到的是 8 幅不同的贴图,实际上并不是通过图形学绘制渲染出来的多边形。
    “古墓丽影”“最终幻想 7”,这些游戏都是在那个时代诞生的。
    当时,很多国内的计算机爱好者梦寐以求的,是一块 Voodoo FX 的显卡。

    三维图像的渲染流程

    你在玩的各种游戏,里面的人物的脸,并不是那个相机或者摄像头拍出来的,而是通过多边形建模(Polygon Modeling)创建出来的。

    图像进行实时渲染的过程,可以被分解成下面5 个步骤:顶点处理(Vertex Processing)、图元处理(Primitive Processing)、栅格化(Rasterization)、片段处理(Fragment Processing)、像素操作(Pixel Operations)。

    • 顶点处理

    把顶点在三维空间里面的位置,转化到屏幕二维空间里面

    每一个顶点位置的转换,互相之间没有依赖,是可以并行独立计算的。

    • 图元处理

    将转化后的顶点连起来,剔除不在屏幕中的部分

    • 栅格化

    把处理好的多边形,转化成一个个像素点

    栅格化操作,和顶点处理是一样的,每一个图元都可以并行独立地栅格化。

    • 片段处理

    计算每一个像素的颜色、透明度等信息,给像素点上色

    这步操作,同样也可以每个片段并行、独立进行。

    • 像素操作

    把不同的多边形的像素点“混合(Blending)”到一起。

    处理多边形间的遮挡,透明关系。造成的颜色变化。


    图形流水线

    上述顶点处理、图元处理、 栅格化、片段处理,以及最后的像素操作。这一连串的过程,也被称之为图形流水线或者渲染管线。


    可编程管线

    这个编程能力不是像 CPU 那样,有非常通用的指令,可以进行任何你希望的操作,而是在整个的渲染管线(Graphics Pipeline)的一些特别步骤,能够自己去定义处理数据的算法或者操作。

    早期的GPU整个图形渲染过程都是在硬件里面固定的管线来完成的。
    程序员们在加速卡上能做的事情呢,只有改配置来实现不同的图形渲染效果。如果通过改配置做不到,我们就没有什么办法了。

    着色器

    只能修改顶点处理和片段处理部分的程序逻辑。主要是光照、亮度、颜色等等的处理。

    内部有两类Shader,分别用来进行顶点处理(多边形的顶点)和片段操作(像素点)。

    统一着色器架构

    GPU内部使用同一的通用Shader进行工作,同一调配。

    虽然我们在顶点处理和片段处理上的具体逻辑不太一样,但是里面用到的指令集可以用同一套。
    那不如就在 GPU 里面放很多个一样的 Shader 硬件电路,然后通过统一调度,把顶点处理、图元处理、片段处理这些任务,都交给这些 Shader 去处理,让整个 GPU 尽可能地忙起来。

    GPGPU(General-Purpose Computing on Graphics Processing Units,通用图形处理器)

    正因为 Shader 变成一个“通用”的模块,才有了把 GPU 拿来做各种通用计算的用法。也就是GPGPU。


    现代 GPU 的三个核心创意

    为什么现代的 GPU 在图形渲染、深度学习上能那么快。

    芯片瘦身

    剔除CPU上占据大量资源的各种预测以及IO加速逻辑。

    GPU 的整个处理过程是一个流式处理(Stream Processing)的过程,并没有那么多的分支和依赖。
    处理乱序执行、进行分支预测,以及高速缓存相关的电路都可以去掉,只保留必要的下取指令、指令译码、ALU 以及执行这些计算需要的寄存器和缓存就好了。

    多核并行和 SIMT

    相当于CPU的多核以及SIMT

    和 CPU 不同的是,我们不需要单独去实现什么多线程的计算。因为 GPU 的运算是天然并行的。

    在做向量计算的时候,我们要执行的指令是一样的,只是同一个指令的数据有所不同而已
    在 SIMD 里面,CPU 一次性取出了固定长度的多个数据,放到寄存器里面,用一个指令去执行。
    而 SIMT由于任务天然并行,可以把多条数据,交给不同的线程去处理。这样,我们的一个 GPU 的核里,就可以放下更多的 ALU,同时进行更多的并行运算了。

    GPU 里的“超线程”

    当流水线停顿时、调度一些别的计算任务给当前的 ALU

    和超线程一样,既然要调度一个不同的任务过来,我们就需要针对这个任务,提供更多的执行上下文。所以,一个 Core 里面的执行上下文的数量,需要比 ALU 多。


    深度学习中的GPU

    随着 GPGPU 的推出,GPU 已经不只是一个图形计算设备,更是一个用来做数值计算的好工具了。同样,也是因为 GPU 的快速发展,带来了过去 10 年深度学习的繁荣。

    1. GPU 是一个可以进行“通用计算”的框架,我们可以通过编程,在 GPU 上实现不同的算法。
    2. 现在的深度学习计算,都是超大的向量和矩阵,海量的训练样本的计算。整个计算过程中,没有复杂的逻辑和分支,非常适合 GPU 这样并行、计算能力强的架构。

    在实际进行深度学习的过程中,用 GPU 所花费的时间,往往能减少一到两个数量级。
    而大型的深度学习模型计算,往往又是多卡并行,要花上几天乃至几个月。这个时候,用 CPU 显然就不合适了。

    相关文章

      网友评论

          本文标题:计算机组成原理--GPU

          本文链接:https://www.haomeiwen.com/subject/vgococtx.html