计算机组成原理-特殊设备

计算机组成原理-显卡(特殊设备)

  本文根据徐文浩老师的计算机组成原理记录:计算机组成原理

  CSDN base64 图片显示有问题, 想要个人笔记的可以私我

1 图形的渲染过程

  现在电脑里面显示出来的 3D 的画面,其实是通过多边形组合出来的。你在玩的各种游戏,里面的人物的脸,并不是那个相机或者摄像头拍出来的,而是通过多边形建模(Polygon Modeling)创建出来的。

  这个对于图像进行实时渲染的过程,可以被分解成下面这样 5 个步骤:

  1. 顶点处理(Vertex Processing)
  2. 图元处理(Primitive Processing)
  3. 栅格化(Rasterization)
  4. 片段处理(Fragment Processing)
  5. 像素操作(Pixel Operations)

1.1 顶点处理

  图形渲染的第一步是顶点处理。构成多边形建模的每一个多边形呢,都有多个顶点(Vertex)。这些顶点都有一个在三维空间里的坐标。但是屏幕是二维的,所以在确定当前视角的时候,需要把这些顶点在三维空间里面的位置,转化到屏幕这个二维空间里面。这个转换的操作,就被叫作顶点处理。这里面每一个顶点位置的转换,互相之间没有依赖,是可以并行独立计算的。

1.2 图元处理

  图元处理,其实就是要把顶点处理完成之后的各个顶点连起来,变成多边形。其实转化后的顶点,仍然是在一个三维空间里,只是第三维的 Z 轴,是正对屏幕的“深度”。针对这些多边形,需要做一个操作,叫剔除和裁剪(Cull and Clip),也就是把不在屏幕里面,或者一部分不在屏幕里面的内容给去掉,减少接下来流程的工作量。

1.3 栅格化

  屏幕分辨率是有限的。它一般是通过一个个“像素(Pixel)”来显示出内容的。所以,要把图形转换成屏幕里面的一个个像素点。这个操作就叫作栅格化。栅格化操作,有一个特点和顶点处理是一样的,每一个图元都可以并行独立地栅格化。

1.4 片段处理

  片段处理, 就是计算每一个像素的颜色、透明度等信息,给像素点上色。这步操作,同样也可以每个片段并行、独立进行,和顶点处理和栅格化一样。

1.5 像素操作

  把不同的多边形的像素点“混合(Blending)”到一起。可能前面的多边形可能是半透明的,那么前后的颜色就要混合在一起变成一个新的颜色;或者前面的多边形遮挡住了后面的多边形,那么只要显示前面多边形的颜色就好了。最终,输出到显示设备。

2 GPU 与深度学习

  图形渲染的流程是固定的,直接用硬件来处理这部分过程,而且这样的硬件会比制造有同样计算性能的 CPU 要便宜得多。因为整个计算流程是完全固定的,不需要流水线停顿、乱序执行等等的各类导致 CPU 计算变得复杂的问题。也不需要有什么可编程能力,只要让硬件按照写好的逻辑进行运算就好了。

  现代 CPU 里的晶体管变得越来越多,越来越复杂,其实已经不是用来实现“计算”这个核心功能,而是拿来实现处理乱序执行、进行分支预测,以及高速缓存。而在 GPU 里,这些电路就显得有点多余了,GPU 的整个处理过程是一个流式处理(Stream Processing)的过程, GPU 的运算是天然并行的。因为没有那么多分支条件,或者复杂的依赖关系,可以把 GPU 里这些对应的电路都可以去掉,做一次小小的瘦身,只留下取指令、指令译码、ALU 以及执行这些计算需要的寄存器和缓存就好了。一般来说,把这些电路抽象成三个部分,就是取指令和指令译码、ALU 和执行上下文。

![GPU构造][GPU构造]

  GPU 借鉴了 CPU 里面的 SIMD,用了一种叫作SIMT(Single Instruction,Multiple Threads)的技术。SIMT 比 SIMD 更加灵活。在 SIMD 里面,CPU 一次性取出了固定长度的多个数据,放到寄存器里面,用一个指令去执行。而 SIMT,可以把多条数据,交给不同的线程去处理。

  在通过芯片瘦身、SIMT 以及更多的执行上下文,我们就有了一个更擅长并行进行暴力运算的 GPU。这样的芯片,也正适合今天的深度学习的使用场景。一方面,GPU 是一个可以进行“通用计算”的框架,我们可以通过编程,在 GPU 上实现不同的算法。另一方面,现在的深度学习计算,都是超大的向量和矩阵,海量的训练样本的计算。整个计算过程中,没有复杂的逻辑和分支,非常适合 GPU 这样并行、计算能力强的架构。

3 FPGA

  FPGA: 现场可编程门阵列(Field-Programmable Gate Array)。

  • P 代表 Programmable,这个很容易理解。也就是说这是一个可以通过编程来控制的硬件
  • G 代表 Gate 也很容易理解,它就代表芯片里面的门电路。我们能够去进行编程组合的就是这样一个一个门电路
  • A 代表的 Array,叫作阵列,说的是在一块 FPGA 上,密密麻麻列了大量 Gate 这样的门电路
  • 最后一个 F,不太容易理解。它其实是说,一块 FPGA 这样的板子,可以在“现场”多次进行编程。它不像 PAL(Programmable Array Logic,可编程阵列逻辑)这样更古老的硬件设备,只能“编程”一次,把预先写好的程序一次性烧录到硬件里面,之后就不能再修改了

  用存储和功能实现组合逻辑。在 FPGA 里,这些基本的电路逻辑,不是采用布线连接的方式进行的,而是预先根据我们在软件里面设计的逻辑电路,算出对应的真值表,然后直接存到一个叫作 LUT(Look-Up Table,查找表)的电路里面。

  对于需要实现的时序逻辑电路,我们可以在 FPGA 里面直接放上 D 触发器,作为寄存器。这个和 CPU 里的触发器没有什么本质不同。把很多个 LUT 的电路和寄存器组合在一起,变成一个叫作逻辑簇(Logic Cluster)的东西。在 FPGA 里,这样组合了多个 LUT 和寄存器的设备,也被叫做 CLB(Configurable Logic Block,可配置逻辑块)。

  FPGA 是通过可编程逻辑布线,来连接各个不同的 CLB,最终实现想要的芯片功能。这个可编程逻辑布线,可以把它当成铁路网。整个铁路系统已经铺好了,但是整个铁路网里面,设计了很多个道岔。通过控制道岔,来确定不同的列车线路。在可编程逻辑布线里面,“编程”在做的,就是拨动像道岔一样的各个电路开关,最终实现不同 CLB 之间的连接,完成芯片功能。于是,通过 LUT 和寄存器,能够组合出很多 CLB,而通过连接不同的 CLB,最终有了芯片功能。最关键的是,这个组合过程是可以“编程”控制的。而且这个编程出来的软件,还可以后续改写,重新写入到硬件里。让同一个硬件实现不同的芯片功能。从这个角度来说,FPGA 也是“软件吞噬世界”的一个很好的例子。

4 ASIC

  除了 CPU、GPU,以及刚刚的 FPGA,生活中还需要用到很多其他芯片。比如,现在手机里就有专门用在摄像头里的芯片;录音笔里会有专门处理音频的芯片。尽管一个 CPU 能够处理好手机拍照的功能,也能处理好录音的功能,但直接在手机或者录音笔里塞上一个 Intel CPU,显然比较浪费。于是,为这些有专门用途的场景,单独设计一个芯片。这些专门设计的芯片呢,我们称之为ASIC(Application-Specific Integrated Circuit),也就是专用集成电路。对 FPGA 进行“编程”,其实就是把 FPGA 的电路变成了一个 ASIC。

5 TPU

  深度学习热起来之后,计算量最大的并不是进行深度学习的训练,而是深度学习的推断部分。

推断部分,是指完成深度学习训练之后,把训练完成的模型存储下来。这个存储下来的模型,是许许多多个向量组成的参数。然后,根据这些参数,去计算输入的数据,最终得到一个计算结果。这个推断过程,可能是在互联网广告领域,去推测某一个用户是否会点击特定的广告;也可能是经过高铁站的时候,扫一下身份证进行一次人脸识别,判断一下是不是本人。虽然训练一个深度学习的模型需要花的时间不少,但是实际在推断上花的时间要更多。

  模型的训练和推断的不同:

  1. 深度学习的推断工作更简单,对灵活性的要求也就更低
  2. 深度学习的推断的性能,首先要保障响应时间的指标
  3. 深度学习的推断工作,希望在功耗上尽可能少一些

5.1 TPU 的设计

  TPU 的设计满足如下条件:

  1. 向前兼容, 就像一块显卡一样,可以直接插在主板的 PCI-E 口上
  2. 没有像现代 GPU 一样,设计成自己有对应的取指令的电路,而是通过 CPU,向 TPU 发送需要执行的指令
  3. 专用电路和大量缓存,适应推断的工作流程
  4. 对数据做归一化(Normalization)和正则化(Regularization)的处理,使用 8 Bits 数据

![TPU设计][TPU设计]

  在芯片模块图里面,有单独的矩阵乘法单元(Matrix Multiply Unit)、累加器(Accumulators)模块、激活函数(Activation)模块和归一化 / 池化(Normalization/Pool)模块。而且,这些模块是顺序串联在一起的。这是因为,一个深度学习的推断过程,是由很多层的计算组成的。而每一个层(Layer)的计算过程,就是先进行矩阵乘法,再进行累加,接着调用激活函数,最后进行归一化和池化。这里的硬件设计,就是把整个流程变成一套固定的硬件电路。这也是一个 ASIC 的典型设计思路,其实就是把确定的程序指令流程,变成固定的硬件电路。

芯片布局图

  芯片布局图,其中控制电路(Control)只占了 2%。这是因为,TPU 的计算过程基本上是一个固定的流程。不像 CPU 有各种复杂的控制功能,比如冒险、分支预测等等。超过一半的 TPU 的面积,都被用来作为 Local Unified Buffer(本地统一缓冲区)(29%)和矩阵乘法单元(Matrix Mutliply Unit)。相比于矩阵乘法单元,累加器、实现激活函数和后续的归一 / 池化功能的激活管线(Activation Pipeline)也用得不多。因为,在深度学习推断的过程中,矩阵乘法的计算量是最大的,计算也更复杂,所以比简单的累加器和激活函数要占用更多的晶体管。而统一缓冲区(Unified Buffer),则由 SRAM 这样高速的存储设备组成。SRAM 一般被直接拿来作为 CPU 的寄存器或者高速缓存。我们在后面的存储器部分会具体讲。SRAM 比起内存使用的 DRAM 速度要快上很多,但是因为电路密度小,所以占用的空间要大很多。统一缓冲区之所以使用 SRAM,是因为在整个的推断过程中,它会高频反复地被矩阵乘法单元读写,来完成计算。

6 虚拟机

  虚拟机(Virtual Machine)技术,其实就是指在现有硬件的操作系统上,能够模拟一个计算机系统的技术。而模拟一个计算机系统,最简单的办法,其实不能算是虚拟机技术,而是一个模拟器(Emulator)。

6.1 解释型虚拟机

  要模拟一个计算机系统,最简单的办法,就是兼容这个计算机系统的指令集。可以开发一个应用程序,跑在我们的操作系统上。这个应用程序呢,可以识别我们想要模拟的、计算机系统的程序格式和指令,然后一条条去解释执行。这种解释执行方式的最大的优势就是,模拟的系统可以跨硬件。

  比如,Android 手机用的 CPU 是 ARM 的,而我们的开发机用的是 Intel X86 的,两边的 CPU 指令集都不一样,但是一样可以正常运行。如果你想玩的街机游戏,里面的硬件早就已经停产了,那你自然只能选择 MAME 这样的模拟器。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值