玩战地2怎么设置中文5打开游戏就显示这个是怎么回事,电脑是设置的1280*1024啊

商品功能挺全的心率,步数消耗能量,来电短信提示联接微信等等都有,但实现这些功能必须手机必须安装jyou手机APP,否则都实现不了1、微信联接稍有点麻烦需好哆步,但帮助说的很清楚按照说明,一步步很快就能实现。2、来电提示试了下能显示人名到手环上,但只振动2-3次就没有了时间太短,不知是否可以调长点3、抬手唤醒多数时间还是比灵敏的,这个功能用来看时间还是不错的。4、白色字体在户外实在太暗,看不清不过用手挡一下就可以看清了。5、初步测试计步挺准的6、心率也挺准的。7、腾讯信息和短信没有测试成功手机APP已打开,APP上也已设置了启用短信、腾讯、微信信息不知为何来了短信和Q——Q信息就没没有任何提示。微信信息还没测试待测。(京东为什么不让出现**两個字母呢所以只能用腾讯代替))8、其它的闹铃、睡眠监控等待测。坏处:手机的电量会因打开了APP和蓝牙用电快了很多以前充一次能鼡两天,现在估计最多用1天半了呵呵。综上:个人感觉适合喜欢玩电子产品的朋友买去玩玩,还是不错的

在计算机历史的早期其实没囿什么 CISC 和 RISC 之分。或者说所有的 CPU 其实都是 CISC。

虽然冯·诺依曼高屋建瓴地提出了存储程序型计算机的基础架构,但是实际的计算机设计和制造还是严格受硬件层面的限制。当时的计算机很慢,存储空间也很小。《人月神话》这本软件工程界的名著,讲的是花了好几年设计 IBM 360 这台計算机的经验IBM 360 的最低配置,每秒只能运行 34500 条指令只有 8K 的内存。为了让计算机能够做尽量多的工作每一个字节乃至每一个比特都特别偅要。

所以CPU 指令集的设计,需要仔细考虑硬件限制为了性能考虑,很多功能都直接通过硬件电路来完成为了少用内存,指令的长度吔是可变的就像算法和数据结构里的一样,常用的指令要短一些不常用的指令可以长一些。那个时候的计算机想要用尽可能少的内存空间,存储尽量多的指令

不过,历史的车轮滚滚向前计算机的性能越来越好,存储的空间也越来越大了到了 70 年代末,RISC 开始登上了曆史的舞台当时,的大卫·帕特森(David Patterson)教授发现实际在 CPU 运行的程序里,80% 的时间都是在使用 20% 的简单指令于是,他就提出了 RISC 的理念自此之后,RISC 类型的 CPU 开始快速蓬勃发展

RISC 架构的 CPU 究竟是什么样的呢?为什么它能在这么短的时间内受到如此大的追捧

RISC 架构的 CPU 的想法其实非常矗观。既然我们 80% 的时间都在用 20% 的简单指令那我们能不能只要那 20% 的简单指令就好了呢?答案当然是可以的因为指令数量多,计算机科学镓们在软硬件两方面都受到了很多挑战

在硬件层面,我们要想支持更多的复杂指令CPU 里面的电路就要更复杂,设计起来也就更困难更複杂的电路,在散热和功耗层面也会带来更大的挑战。

在软件层面支持更多的复杂指令,编译器的优化就变得更困难毕竟,面向 2000 个指令来优化编译器和面向 500 个指令来优化编译器的困难是完全不同的

于是,在 RISC 架构里面CPU 选择把指令“精简”到 20% 的简单指令。而原先的复雜指令则通过用简单指令组合起来来实现,让软件来实现硬件的功能这样,CPU 的整个硬件设计就会变得更简单了在硬件层面提升性能吔会变得更容易了。

RISC 的 CPU 里完成指令的电路变得简单了于是也就腾出了更多的空间。这个空间常常被拿来放通用寄存器。因为 RISC 完成同样嘚功能执行的指令数量要比 CISC 多,所以如果需要反复从内存里面读取指令或者数据到寄存器里来,那么很多时间就会花在访问内存上於是,RISC 架构的 CPU 往往就有更多的通用寄存器

除了寄存器这样的存储空间,RISC 的 CPU 也可以把更多的晶体管用来实现更好的分支预测等相关功能,进一步去提升 CPU 实际的执行效率

总的来说,对于 CISC 和 RISC 的对比我们可以一起回之前讲的程序运行时间的公式:

CISC 的架构,其实就是通过优化指令数来减少 CPU 的执行时间。而 RISC 的架构其实是在优化 CPI。因为指令比较简单需要的时钟周期就比较少。

面对这么多负面评价嘚 Intel自然也不能无动于衷。更何况x86 架构的问题并不能说明 Intel 的工程师不够厉害。事实上在整个 CPU 设计的领域,Intel 集中了大量优秀的人才无論是成功的 Pentium 时代引入的超标量设计,还是失败的 Pentium 4 时代引入的超线程技术都是异常精巧的工程实现。

而 x86 架构所面临的种种问题其实都来洎于一个最重要的考量,那就是指令集的向前兼容性因为 x86 在商业上太成功了,所以市场上有大量的 Intel CPU而围绕着这些 CPU,又有大量的操作系統、编译器这些系统软件只支持 x86 的指令集,就比如著名的 Windows 95而在这些系统软件上,又有各种各样的应用软件

如果 Intel 要放弃 x86 的架构和指令集,开发一个 RISC 架构的 CPU面临的第一个问题就是所有这些软件都是不兼容的。事实上Intel 并非没有尝试过在 x86 之外另起炉灶,这其实就是在之前介绍的安腾处理器当时,Intel 想要在 CPU 进入 64 位的时代的时候丢掉 x86 的历史包袱,所以推出了全新的 IA-64 的架构但是,却因为不兼容 x86 的指令集遭遇了重大的失败。

反而是 AMD趁着 Intel 研发安腾的时候,推出了兼容 32 位 x86 指令集的 64 位架构也就是 AMD64。如果你现在在 Linux 下安装各种软件包一定经常会看到像下面这样带有 AMD64 字样的内容。这是因为 x86 下的 64 位的指令集 x86-64并不是 Intel 发明的,而是 AMD 发明的

花开两朵,各表一枝Intel 在开发安腾处理器的同時,也在不断借鉴其他 RISC 处理器的设计思想既然核心问题是要始终向前兼容 x86 的指令集,那么我们能不能不修改指令集但是让 CISC 风格的指令集,用 RISC 的形式在 CPU 里面运行呢

在微指令架构的 CPU 里面,编译器编译出来的机器码和汇编代码并没有发生什么变化但在指令译码的阶段,指囹译码器“翻译”出来的不再是某一条 CPU 指令。译码器会把一条机器码“翻译”成好几条“微指令”。这里的一条条微指令就不再是 CISC 風格的了,而是变成了固定长度的 RISC 风格的了

这些 RISC 风格的微指令,会被放到一个微指令缓冲区里面然后再从缓冲区里面,分发给到后面嘚超标量并且是乱序执行的流水线架构里面。不过这个流水线架构里面接受的就不是复杂的指令,而是精简的指令了在这个架构里,我们的指令译码器相当于变成了设计模式里的一个“适配器”(Adaptor)这个适配器,填平了 CISC 和 RISC 之间的指令差异

不过,凡事有好处就有坏處这样一个能够把 CISC 的指令译码成 RISC 指令的指令译码器,比原来的指令译码器要复杂这也就意味着更复杂的电路和更长的译码时间:本来鉯为可以通过 RISC 提升的性能,结果又有一部分浪费在了指令译码上针对这个问题,我们有没有更好的办法呢

在前面说过,之所以大家认為 RISC 优于 CISC来自于一个数字统计,那就是在实际的程序运行过程中有 80% 运行的代码用着 20% 的常用指令。这意味着CPU 里执行的代码有很强的局部性。而对于有着很强局部性的问题常见的一个解决方案就是使用缓存。

所以Intel 就在 CPU 里面加了一层 L0 Cache。这个 Cache 保存的就是指令译码器把 CISC 的指令“翻译”成 RISC 的微指令的结果于是,在大部分情况下CPU 都可以从 Cache 里面拿到译码结果,而不需要让译码器去进行实际的译码操作这样不仅優化了性能,因为译码器的晶体管开关动作变少了还减少了功耗。

因为“微指令”架构的存在从 Pentium Pro 开始,Intel 处理器已经不是一个纯粹的 CISC 处悝器了它同样融合了大量 RISC 类型的处理器设计。不过由于 Intel 本身在 CPU 层面做的大量优化,比如乱序执行、分支预测等相关工作x86 的 CPU 始终在功耗上还是要远远超过 RISC 架构的 ARM,所以最终在智能手机崛起替代 PC 的时代落在了 ARM

2017 年,ARM 公司的 CEO Simon Segards 宣布ARM 累积销售的芯片数量超过了 1000 亿。作为一个從 12 个人起步在 80 年代想要获取 Intel 的 80286 架构授权来制造 CPU 的公司,ARM 是如何在移动端把自己的芯片塑造成了最终的霸主呢

ARM 这个名字现在的含义,是“Advanced RISC Machines”你从名字就能够看出来,ARM 的芯片是基于 RISC 架构的不过,ARM 能够在移动端战胜 Intel并不是因为 RISC 架构。

到了 21 世纪的今天CISC 和 RISC 架构的分界已经沒有那么明显了。Intel 和 AMD 的 CPU 也都是采用译码成 RISC 风格的微指令来运行而 ARM 的芯片,一条指令同样需要多个时钟周期有乱序执行和多发射。

ARM 真正能够战胜 Intel我觉得主要是因为下面这两点原因。

第一点是功耗优先的设计一个 4 核的 Intel i7 的 CPU,设计的时候功率就是 130W而一块 ARM A8 的单个核心的 CPU,设計功率只有 2W两者之间差出了 100 倍。在移动设备上功耗是一个远比性能更重要的指标,毕竟我们不能随时在身上带个发电机ARM 的 CPU,主频更低晶体管更少,高速缓存更小乱序执行的能力更弱。所有这些都是为了功耗所做的妥协。

第二点则是低价ARM 并没有自己垄断 CPU 的生产囷制造,只是进行 CPU 设计然后把对应的知识产权授权出去,让其他的厂商来生产 ARM 架构的 CPU它甚至还允许这些厂商可以基于 ARM 的架构和指令集,设计属于自己的 CPU像苹果、三星、华为,它们都是拿到了基于 ARM 体系架构设计和制造 CPU 的授权ARM 自己只是收取对应的专利授权费用。多个厂商之间的竞争使得 ARM 的芯片在市场上价格很便宜。所以尽管 ARM 的芯片的出货量远大于 Intel,但是收入和利润却比不上 Intel

不过,ARM 并不是开源的所以,在 ARM 架构逐渐垄断移动端芯片市场的时候“开源硬件”也慢慢发展起来了。一方面MIPS 在 2019 年宣布开源;另一方面,从 UC Berkeley 发起的项目也越來越受到大家的关注而 RISC 概念的发明人,图灵奖的得主大卫·帕特森教授从伯克利退休之后成了 RISC-V 国际开源实验室的负责人,开始推动 RISC-V 这个“CPU 届的 Linux”的开发可以想见,未来的开源 CPU也多半会像 Linux 一样,逐渐成为一个业界的主流选择如果想要“打造一个属于自己 CPU”,不可不关紸这个项目

RISC 的指令是固定长度的,CISC 的指令是可变长度的RISC 的指令集里的指令数少,而且单个指令只完成简单的功能所以被称为“精简”。CISC 里的指令数多为了节约内存,直接在硬件层面能够完成复杂的功能所以被称为“复杂”。RISC 的通过减少 CPI 来提升性能而 CISC 通过减尐需要的指令数来提升性能。

然后我们进一步介绍了 Intel 的 x86 CPU 的“微指令”的设计思路。“微指令”使得我们在机器码层面保留了 CISC 风格的 x86 架构嘚指令集但是,通过指令译码器和 L0 缓存的组合使得这些指令可以快速翻译成 RISC 风格的微指令,使得实际执行指令的流水线可以用 RISC 的架构來搭建使用“微指令”设计思路的 CPU,不能再称之为 CISC 了而更像一个 RISC 和 CISC 融合的产物。

过去十年里Intel 仍然把持着 PC 和服务器市场,但是更多的市场上的 CPU 芯片来自基于 ARM 架构的智能手机了而在 ARM 似乎已经垄断了移动 CPU 市场的时候,开源的 RISC-V 出现了也给了计算机工程师们新的设计属于自巳的 CPU 的机会。

GPU 是随着我们开始在计算机里面需要渲染三维图形的出现而发展起来的设备。图形渲染和设备的先驱第一个要算是 SGI(Silicon Graphics Inc.)这家公司。SGI 的名字翻译成中文就是“硅谷图形公司”这家公司从 80 年代起就开发了很多基于 Unix 操作系统的工作站。它的创始人 Jim Clark 是斯坦福的教授也是图形学的专家。

后来他也是网景公司(Netscape)的创始人之一。而 Netscape就是那个曾经和 IE 大战 300 回合的浏览器公司,虽然最终败在微软的 Windows 免费捆绑 IE 的策略下但是也留下了 Firefox 这个完全由开源基金会管理的浏览器。

到了 90 年代中期随着个人电脑的性能越来越好,PC 游戏玩家們开始有了“3D 显卡”的需求那个时代之前的 3D 游戏,其实都是伪 3D比如,大神卡马克开发的著名(德军总部 3D)从不同视角看到的是 8 幅不哃的贴图,实际上并不是通过图形学绘制渲染出来的多边形

这样的情况下,游戏玩家的视角旋转个 10 度看到的画面并没有变化。但是如果转了 45 度看到的画面就变成了另外一幅图片。而如果我们能实时渲染基于多边形的 3D 画面的话那么任何一点点的视角变化,都会实时在畫面里面体现出来就好像你在真实世界里面看到的一样。

而在 90 年代中期随着硬件和技术的进步,我们终于可以在 PC 上用硬件直接实时渲染多边形了“真 3D”游戏开始登上历史舞台了。“古墓丽影”“最终幻想 7”这些游戏都是在那个时代诞生的。当时很多国内的计算机愛好者梦寐以求的,是一块 Voodoo FX 的显卡

那为什么 CPU 的性能已经大幅度提升了,但是我们还需要单独的 GPU 呢想要了解这个问题,我们先来看一看彡维图像实际通过计算机渲染出来的流程

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

而实际这些人粅在画面里面的移动、动作乃至根据光线发生的变化,都是通过计算机根据图形学的各种计算实时渲染出来的。

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

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

如果你稍微学过一点图形学的话,应该知道这样嘚转化都是通过线性代数的计算来进行的。可以想见我们的建模越精细,需要转换的顶点数量就越多计算量就越大。而且这里面每┅个顶点位置的转换,互相之间没有依赖是可以并行独立计算的。

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

在图元处理完成之后呢渲染还远远没有完成。我们的屏幕分辨率是有限的它一般是通过一个个“像素(Pixel)”来显示出内容的。所以对于做完图元处理的多边形,我们要开始进行第三步操作这个操作就是把它们转换成屏幕里面的一个个像素点。这个操作呢就叫作栅格化。这个栅格化操作有一个特点和上面的顶点处理是一样的,就是每一个图元都可以并行独立地栅格化

在栅格化变成了像素点之后,我们的图还是“黑白”的我们还需要计算每一个像素的颜色、透明度等信息,给像素点上色这步操作,就是片段处理这步操作,同样也可以每个片段并行、独立进行和上面的顶点处悝和栅格化一样。

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

经过这完整的 5 个步骤之后,我们就完成了从三维空间里的数据的渲染变成屏幕上你可以看到的 3D 动画了。这样 5 個步骤的渲染流程呢一般也被称之为图形流水线(Graphic Pipeline)。这个名字和我们讲解 CPU 里面的流水线非常相似都叫Pipeline

解放图形渲染的 GPU

我们可以想一想如果用 CPU 来进行这个渲染过程,需要花上多少资源呢我们可以通过一些数据来做个粗略的估算。

在上世纪 90 年代的时候屏幕的分辨率还没有现在那么高。一般的 CRT 显示器也就是 640×480 的分辨率这意味着屏幕上有 30 万个像素需要渲染。为了让我们的眼睛看到画媔不晕眩我们希望画面能有 60 帧。于是每秒我们就要重新渲染 60 次这个画面。也就是说每秒我们需要完成 1800 万次单个像素的渲染。从栅格囮开始每个像素有 3 个流水线步骤,即使每次步骤只有 1 个指令那我们也需要 5400 万条指令,也就是 54M 条指令

90 年代的 CPU 的性能是多少呢?93 年出货嘚第一代 Pentium 处理器主频是 60MHz,后续逐步推出了 66MHz、75MHz、100MHz 的处理器以这个性能来看,用 CPU 来渲染 3D 图形基本上就要把 CPU 的性能用完了。因为实际的每┅个渲染步骤可能不止一个指令我们的 CPU 可能根本就跑不动这样的三维图形渲染。

也就是在这个时候Voodoo FX 这样的图形加速卡登上了历史舞台。既然图形渲染的流程是固定的那我们直接用硬件来处理这部分过程,不用 CPU 来计算是不是就好了很显然,这样的硬件会比制造有同样計算性能的 CPU 要便宜得多因为整个计算流程是完全固定的,不需要流水线停顿、乱序执行等等的各类导致 CPU 计算变得复杂的问题我们也不需要有什么可编程能力,只要让硬件按照写好的逻辑进行运算就好了

那个时候,整个顶点处理的过程还是都由 CPU 进行的不过后续所有到圖元和像素级别的处理都是通过 Voodoo FX 或者 TNT 这样的显卡去处理的。也就是从这个时代开始我们能玩上“真 3D”的游戏了。

不过无论是 Voodoo FX 还是 NVidia TNT。整個显卡的架构还不同于我们现代的显卡也没有现代显卡去进行各种加速深度学习的能力。这个能力要到 NVidia 提出 Unified Shader Archicture 才开始具备。这也是我们丅一讲要讲的内容

Shader 的诞生和可编程图形处理器

不知道你有没有发现,在 Voodoo 和 TNT 显卡的渲染管线里面没有“顶点處理“这个步骤。在当时把多边形的顶点进行线性变化,转化到我们的屏幕的坐标系的工作还是由 CPU 完成的所以,CPU 的性能越好能够支歭的多边形也就越多,对应的多边形建模的效果自然也就越像真人而 3D 游戏的多边形性能也受限于我们 CPU 的性能。无论你的显卡有多快如果 CPU 不行,3D

所以1999 年 NVidia 推出的 GeForce 256 显卡,就把顶点处理的计算能力也从 CPU 里挪到了显卡里。不过这对于想要做好 3D 游戏的程序员们还不够,即使到叻 GeForce 256整个图形渲染过程都是在硬件里面固定的管线来完成的。程序员们在加速卡上能做的事情呢只有改配置来实现不同的图形渲染效果。如果通过改配置做不到我们就没有什么办法了。

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

一开始的可编程管线呢仅限于顶点处理(Vertex Processing)和片段处理(Fragment Processing)部分。比起原来只能通过显卡和 Direct3D 这样的图形接口提供的固定配置程序员们终于也可以开始在图形效果上开始大显身手了。

这些可以编程的接口我们称之为Shader,中文名称就是着色器之所以叫“着銫器”,是因为一开始这些“可编程”的接口只能修改顶点处理和片段处理部分的程序逻辑。我们用这些接口来做的也主要是光照、煷度、颜色等等的处理,所以叫着色器

这个时候的 GPU,有两类 Shader也就是 Vertex Shader 和 Fragment Shader。我们在之前看到在进行顶点处理的时候,我们操作的是多边形的顶点;在片段操作的时候我们操作的是屏幕上的像素点。对于顶点的操作通常比片段要复杂一些。所以一开始这两类 Shader 都是独立嘚硬件电路,也各自有独立的编程接口因为这么做,硬件设计起来更加简单一块 GPU 上也能容纳下更多的 Shader。

不过呢大家很快发现,虽然峩们在顶点处理和片段处理上的具体逻辑不太一样但是里面用到的指令集可以用同一套。而且虽然把 Vertex Shader 和 Fragment Shader 分开,可以减少硬件设计的复雜程度但是也带来了一种浪费,有一半 Shader 始终没有被使用在整个渲染管线里,Vertext Shader 运行的时候Fragment Shader

本来 GPU 就不便宜,结果设计的电路有一半时间昰闲着的喜欢精打细算抠出每一分性能的硬件工程师当然受不了了。于是统一着色器架构(Unified Shader Architecture)就应运而生了。

既然大家用的指令集是┅样的那不如就在 GPU 里面放很多个一样的 Shader 硬件电路,然后通过统一调度把顶点处理、图元处理、片段处理这些任务,都交给这些 Shader 去处理让整个 GPU 尽可能地忙起来。这样的设计就是我们现代 GPU 的设计,就是统一着色器架构

有意思的是,这样的 GPU 并不是先在 PC 里面出现的而是來自于一台游戏机,就是微软的 XBox 360后来,这个架构才被用到 ATI 和 NVidia 的显卡里这个时候的“着色器”的作用,其实已经和它的名字关系不大了而是变成了一个通用的抽象计算模块的名字。

现代 GPU 的三个核心创意

讲完了现代 GPU 的进化史那么接下来,我们就来看看为什么现代的 GPU 在图形渲染、深度学习上能那么快。

我们先来回顾一下之前花了很多讲仔细讲解的现代 CPU。现代 CPU 里的晶体管变嘚越来越多越来越复杂,其实已经不是用来实现“计算”这个核心功能而是拿来实现处理乱序执行、进行分支预测,存储器的高速缓存部分

而在 GPU 里,这些电路就显得有点多余了GPU 的整个处理过程是一个(Stream Processing)的过程。因为没有那么多分支条件或者复杂的依赖关系,我們可以把 GPU 里这些对应的电路都可以去掉做一次小小的瘦身,只留下取指令、指令译码、ALU 以及执行这些计算需要的寄存器和缓存就好了┅般来说,我们会把这些电路抽象成三个部分就是下面图里的取指令和指令译码、ALU

这样一来,我们的 GPU 电路就比 CPU 简单很多了於是,我们就可以在一个 GPU 里面塞很多个这样并行的 GPU 电路来实现计算,就好像 CPU 里面的多核 CPU 一样和 CPU 不同的是,我们不需要单独去实现什么哆线程的计算因为 GPU 的运算是天然并行的。

无论是对多边形里的顶点进行处理还是屏幕里面的每一个像素进行处理,每个点的计算都是獨立的所以,简单地添加多核的 GPU就能做到并行加速。不过光这样加速还是不够工程师们觉得,性能还有进一步被压榨的空间

CPU 里有┅种叫作 SIMD 的处理技术。这个技术是说在做向量计算的时候,我们要执行的指令是一样的只是同一个指令的数据有所不同而已。在 GPU 的渲染管线里这个技术可就大有用处了。

无论是顶点去进行线性变换还是屏幕上临近像素点的光照和上色,都是在用相同的指令流程进行計算所以,GPU 就借鉴了 CPU 里面的 SIMD用了一种叫作(Single Instruction,Multiple Threads)的技术SIMT 呢,比 SIMD 更加灵活在 SIMD 里面,CPU 一次性取出了固定长度的多个数据放到寄存器裏面,用一个指令去执行而 SIMT,可以把多条数据交给不同的线程去处理。

各个线程里面执行的指令流程是一样的但是可能根据数据的鈈同,走到不同的条件分支这样,相同的代码和相同的流程可能执行不同的具体的指令。这个线程走到的是 if 的条件分支另外一个线程走到的就是 else 的条件分支了。

于是我们的 GPU 设计就可以进一步进化,也就是在取指令和指令译码的阶段取出的指令可以给到后面多个不哃的 ALU 并行进行运算。这样我们的一个 GPU 的核里,就可以放下更多的 ALU同时进行更多的并行运算了。

GPU 里的“超线程”

虽然 GPU 里面的主要以数值计算为主不过既然已经是一个“通用计算”的架构了,GPU 里面也避免不了会有 if…else 这样的条件分支但是,在 GPU 里我们可没有 CPU 这样嘚分支预测的电路这些电路在上面“芯片瘦身”的时候,就已经被我们砍掉了

所以,GPU 里的指令可能会遇到和 CPU 类似的“流水线停顿”問题。想到流水线停顿你应该就能记起,我们之前在 CPU 里面讲过超线程技术在 GPU 上,我们一样可以做类似的事情也就是遇到停顿的时候,调度一些别的计算任务给当前的 ALU

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

GPU 在深度学习上的性能差异

在通过芯片瘦身、SIMT 以及更多的执行仩下文我们就有了一个更擅长并行进行暴力运算的 GPU。这样的芯片也正适合我们今天的深度学习的使用场景。

一方面GPU 是一个可以进行“通用计算”的框架,我们可以通过编程在 GPU 上实现不同的算法。

另一方面现在的深度学习计算,都是超大的向量和矩阵海量的训练樣本的计算。整个计算过程中没有复杂的逻辑和分支,非常适合 GPU 这样并行、计算能力强的架构

我们去看 NVidia 2080 显卡的,就可以算出它到底囿多大的计算能力。

2080 的主频是 1515MHz如果自动超频(Boost)的话,可以到 1700MHz而 NVidia 的显卡,根据硬件架构的设计每个时钟周期可以执行两条指令。所鉯能做的浮点数运算的能力,就是:

对照一下官方的技术规格正好就是 10.07TFLOPS。

那么最新的 Intel i9 9900K 的性能是多少呢?不到 1TFLOPS而 2080 显卡和 9900K 的价格却是差不多的。所以在实际进行深度学习的过程中,用 GPU 所花费的时间往往能减少一到两个数量级。而大型的深度学习模型计算往往又是哆卡并行,要花上几天乃至几个月这个时候,用 CPU 显然就不合适了

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

了解了一个基于多边形建模的三维图形的渲染过程这个渲染过程需要经过顶点处理、图元处理、栅格化、片段处理以及像素操作这 5 个步骤。这 5 个步骤把存储在内存里面的多边形数据变荿了渲染在屏幕上的画面因为里面的很多步骤,都需要渲染整个画面里面的每一个像素所以其实计算量是很大的。我们的 CPU 这个时候僦有点跑不动了。

于是像 3dfx 和 NVidia 这样的厂商就推出了 3D 加速卡,用硬件来完成图元处理开始的渲染流程这些加速卡和现代的显卡还不太一样,它们是用固定的处理流程来完成整个 3D 图形渲染的过程不过,因为不用像 CPU 那样考虑计算和处理能力的通用性我们就可以用比起 CPU 芯片更低的成本,更好地完成 3D 图形的渲染工作而 3D 游戏的时代也是从这个时候开始的。

GPU 一开始是没有“可编程”能力的程序员们只能够通过配置来设计需要用到的图形渲染效果。随着“可编程管线”的出现程序员们可以在顶点处理和片段处理去实现自己的算法。为了进一步去提升 GPU 硬件里面的芯片利用率微软在 XBox 360 里面,第一次引入了“统一着色器架构”使得 GPU 变成了一个有“通用计算”能力的架构。

接着我们從一个 CPU 的硬件电路出发,去掉了对 GPU 没有什么用的分支预测和乱序执行电路来进行瘦身。之后基于渲染管线里面顶点处理和片段处理就昰天然可以并行的了。我们在 GPU 里面可以加上很多个核

又因为我们的渲染管线里面,整个指令流程是相同的我们又引入了和 CPU 里的 SIMD 类似的 SIMT 架构。这个改动进一步增加了 GPU 里面的 ALU 的数量。最后为了能够让 GPU 不要遭遇流水线停顿,我们又在同一个 GPU 的计算核里面加上了更多的执荇上下文,让 GPU 始终保持繁忙

GPU 里面的多核、多 ALU,加上多 Context使得它的并行能力极强。同样架构的 GPU如果光是做数值计算的话,算力在同样价格的 CPU 的十倍以上而这个强大计算能力,以及“统一着色器架构”使得 GPU 非常适合进行深度学习的计算模式,也就是海量计算容易并行,并且没有太多的控制分支逻辑

使用 GPU 进行深度学习,往往能够把深度学习算法的训练时间缩短一个,乃至两个数量级而 GPU 现在也越来樾多地用在各种科学计算和机器学习上,而不仅仅是用在图形渲染上了

CPU 其实就是一些简单的门电路像搭积木一样搭出来的。从最简單的门电路搭建成半加器、全加器,然后再搭建成完整功能的 ALU这些电路里呢,有完成各种实际计算功能的组合逻辑电路也有用来控淛数据访问,创建出寄存器和内存的时序逻辑电路

在我们现代 CPU 里面,有多少个晶体管这样的电路开关呢这个答案说出来有点儿吓人。┅个四核 i7 的 Intel CPU上面的晶体管数量差不多有 20 亿个。那接着问题就来了我们要想设计一个 CPU,就要想办法连接这 20 亿个晶体管

这已经够难了,後面还有更难的就像我们写程序一样,连接晶体管不是一次就能完事儿了的设计更简单一点儿的专用于特定功能的芯片,少不了要几個月而设计一个 CPU,往往要以“年”来计在这个过程中,硬件工程师们要设计、验证各种各样的技术方案可能会遇到各种各样的 Bug。如果我们每次验证一个方案都要单独设计生产一块芯片,那这个代价也太高了

我们有没有什么办法,不用单独制造一块专门的芯片来验證硬件设计呢能不能设计一个硬件,通过不同的程序代码来操作这个硬件之前的电路连线,通过“编程”让这个硬件变成我们设计的電路连线的芯片呢

这个,就是我们接下来要说的 FPGA也就是现场可编程门阵列(Field-Programmable Gate Array)。看到这个名字你可能要说了,这里面每个单词单独峩都认识放到一起就不知道是什么意思了。

没关系我们就从 FPGA 里面的每一个字符,一个一个来看看它到底是什么意思

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

这么看来,其实“FPGA”这样的组合基本上解决了我们前面说的想要设计硬件的问题。我们可以像软件一样对硬件编程可以反复烧录,还有海量的门电路可以组合实现复杂的芯片功能。

不过相信你和我一样恏奇,我们究竟怎么对硬件进行编程呢我们之前说过,CPU 其实就是通过晶体管来实现各种组合逻辑或者时序逻辑。那么我们怎么去“編程”连接这些线路呢?

FPGA 的解决方案很精巧我把它总结为这样三个步骤。

第一用存储换功能实现组合逻辑。在实现 CPU 的功能的时候我們需要完成各种各样的电路逻辑。在 FPGA 里这些基本的电路逻辑,不是采用布线连接的方式进行的而是预先根据我们在软件里面设计的逻輯电路,算出对应的真值表然后直接存到一个叫作 LUT(Look-Up Table,查找表)的电路里面这个 LUT 呢,其实就是一块存储空间里面存储了“特定的输叺信号下,对应输出 0 还是 1”

如果还没理解,你可以想一下这个问题假如现在我们要实现一个函数,这个函数需要返回斐波那契数列的苐 N 项并且限制这个 N 不会超过 100。该怎么解决这个问题呢

斐波那契数列的通项公式是 f(N) = f(N-1) + f(N-2) 。所以我们的第一种办法,自然是写一个程序从苐 1 项开始算。但其实还有一种办法就是我们预先用程序算好斐波那契数量前 100 项,然后把它预先放到一个数组里面这个数组就像 [1, 1, 2, 3, 5…] 这样。当要计算第 N 项的时候呢我们并不是去计算得到结果,而是直接查找这个数组里面的第 N 项

这里面的关键就在于,这个查表的办法不呮能够提供斐波那契数列。如果我们要有一个获得 N 的 5 次方的函数一样可以先计算好,放在表里面进行查询这个“查表”的方法,其实僦是 FPGA 通过 LUT 来实现各种组合逻辑的办法

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

我们通过配置 CLB 实现的功能有点儿像我们前面讲过的全加器。它已经在最基础的门电路上做了组合能够提供哽复杂一点的功能。更复杂的芯片功能我们不用再从门电路搭起,可以通过 CLB 组合搭建出来

第三,FPGA 是通过可编程逻辑布线来连接各个鈈同的 CLB,最终实现我们想要实现的芯片功能这个可编程逻辑布线,你可以把它当成我们的铁路网整个铁路系统已经铺好了,但是整个鐵路网里面设计了很多个道岔。我们可以通过控制道岔来确定不同的列车线路。在可编程逻辑布线里面“编程”在做的,就是拨动潒道岔一样的各个电路开关最终实现不同 CLB 之间的连接,完成我们想要的芯片功能

于是,通过 LUT 和寄存器我们能够组合出很多 CLB,而通过連接不同的 CLB最终有了我们想要的芯片功能。最关键的是这个组合过程是可以“编程”控制的。而且这个编程出来的软件还可以后续妀写,重新写入到硬件里让同一个硬件实现不同的芯片功能。从这个角度来说FPGA 也是“软件吞噬世界”的一个很好的例子。

除了 CPU、GPU以忣刚刚的 FPGA,我们其实还需要用到很多其他芯片比如,现在手机里就有专门用在摄像头里的芯片;录音笔里会有专门处理音频的芯片尽管一个 CPU 能够处理好手机拍照的功能,也能处理好录音的功能但是在我们直接在手机或者录音笔里塞上一个 Intel CPU,显然比较浪费

于是,我们僦考虑为这些有专门用途的场景单独设计一个芯片。这些专门设计的芯片呢我们称之为ASIC(Application-Specific Integrated Circuit),也就是专用集成电路事实上,过去几姩ASIC 发展得仍旧特别快。因为 ASIC 是针对专门用途设计的所以它的电路更精简,单片的制造成本也比 CPU 更低而且,因为电路精简所以通常能耗要比用来做通用计算的 CPU 更低。

因为 ASIC 的生产制造成本以及能耗上的优势,过去几年里有不少公司设计和开发 ASIC 用来“挖矿”。这个“挖矿”说的其实就是设计专门的数值计算芯片,用来“挖”比特币、ETH 这样的数字货币

那么,我们能不能用刚才说的 FPGA 来做 ASIC 的事情呢当嘫是可以的。我们对 FPGA 进行“编程”其实就是把 FPGA 的电路变成了一个 ASIC。这样的芯片往往在成本和功耗上优于需要做通用计算的 CPU 和 GPU。

那你可能又要问了那为什么我们干脆不要用 ASIC 了,全都用 FPGA 不就好了么你要知道,其实 FPGA 一样有缺点那就是它的硬件上有点儿“浪费”。这个很嫆易理解我一说你就明白了。

每一个 LUT 电路其实都是一个小小的“浪费”。一个 LUT 电路设计出来之后既可以实现与门,又可以实现或门自然用到的晶体管数量,比单纯连死的与门或者或门的要多得多同时,因为用的晶体管多它的能耗也比单纯连死的电路要大,单片 FPGA 嘚生产制造的成本也比 ASIC 要高不少

当然,有缺点就有优点FPGA 的优点在于,它没有硬件研发成本ASIC 的电路设计,需要仿真、验证还需要经過流片(Tape out),变成一个印刷的电路版最终变成芯片。这整个从研发到上市的过程最低花费也要几万美元,高的话会在几千万乃至数億美元。更何况整个设计还有失败的可能。所以如果我们设计的专用芯片,只是要制造几千片那买几千片现成的 FPGA,可能远比花上几百万美元来设计、制造 ASIC 要经济得多。

实际上到底使用 ASIC 这样的专用芯片,还是采用 FPGA 这样可编程的通用硬件核心的决策因素还是成本。鈈过这个成本不只是单个芯片的生产制造成本,还要考虑总体拥有成本(Total Cost of Ownership)也就是说,除了生产成本之外我们要把研发成本也算进詓。如果我们只制造了一片芯片那么成本就是“这枚芯片的成本 + 为了这枚芯片建的生产线的成本 + 芯片的研发成本”,而不只是“芯片的原材料沙子的成本 + 生产的电费”

单个 ASIC 的生产制造成本比 FPGA 低,ASIC 的能耗也比能实现同样功能的 FPGA 要低能耗低,意味着长时间运行这些芯片所用的电力成本也更低。

但是ASIC 有一笔很高的 NRE(Non-Recuring Engineering Cost,一次性工程费用)成本这个成本,就是 ASIC 实际“研发”的成本只有需要大量生产 ASIC 芯片嘚时候,我们才能摊薄这份研发成本

其实,在我们的日常软件开发过程中也需要做同样的决策。很多我们需要的功能可能在市面上巳经有开源的软件可以实现。我们可以在开源的软件之上做配置或者开发插件也可以选择自己从头开始写代码。

在开源软件或者是买来嘚商业软件上启动往往能很快让产品上线。如果从头开始写代码往往会有一笔不地的 NRE 成本,也就是研发成本但是通常我们自己写的玳码,能够 100% 贴近我们的业务需求后续随着业务需求的改造成本会更低。如果要大规模部署很多服务器的话服务器的成本会更低。学会從 TCO 和 NRE 的成本去衡量做决策也是每一个架构师的必修课。

TPU V1 想要解决什么问题?

黑格尔说“世上没有无缘无故的爱,吔没有无缘无故的恨”第一代 TPU 的设计并不是异想天开的创新,而是来自于真实的需求

从 2012 年解决计算机视觉问题开始,深度学习一下子進入了大爆发阶段也一下子带火了 GPU,NVidia 的股价一飞冲天GPU 天生适合进行海量、并行的矩阵数值计算,于是它被大量用在深度学习的模型训練上

不过你有没有想过,在深度学习热起来之后计算量最大的是什么呢?并不是进行深度学习的训练而是深度学习的推断部分。

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

虽然训练一个深度学習的模型需要花的时间不少但是实际在推断上花的时间要更多。比如我们上面说的高铁,去年(2018 年)一年就有 20 亿人次坐了高铁这也僦意味着至少进行了 20 亿次的人脸识别“推断“工作。

所以第一代的 TPU,首先优化的并不是深度学习的模型训练而是深度学习的模型推断。这个时候你可能要问了那模型的训练和推断有什么不同呢?主要有三个点

第一点,深度学习的推断工作更简单对灵活性的要求也僦更低。模型推断的过程我们只需要去计算一些矩阵的乘法、加法,调用一些 Sigmoid 或者 RELU 这样的激活函数这样的过程可能需要反复进行很多層,但是也只是这些计算过程的简单组合

第二点,深度学习的推断的性能首先要保障响应时间的指标。我们在讲过计算机关注的性能指标,有响应时间(Response Time)和吞吐率(Throughput)我们在模型训练的时候,只需要考虑吞吐率问题就行了因为一个模型训练少则好几分钟,多的話要几个月而推断过程,像互联网广告的点击预测我们往往希望能在几十毫秒乃至几毫秒之内就完成,而人脸识别也不希望会超过几秒钟很显然,模型训练和推断对于性能的要求是截然不同的

第三点,深度学习的推断工作希望在功耗上尽可能少一些。深度学习的訓练对功耗没有那么敏感,只是希望训练速度能够尽可能快多费点电就多费点儿了。这是因为深度学习的推断,要 7×24h 地跑在数据中惢里面而且,对应的芯片要大规模地部署在数据中心。一块芯片减少 5% 的功耗就能节省大量的电费。而深度学习的训练工作大部分凊况下只是少部分算法工程师用少量的机器进行。很多时候只是做小规模的实验,尽快得到结果节约人力成本。少数几台机器多花的電费比起算法工程师的工资来说,只能算九牛一毛了

这三点的差别,也就带出了第一代 TPU 的设计目标那就是,在保障响应时间的情况丅能够尽可能地提高能效比这个指标,也就是进行同样多数量的推断工作花费的整体能源要显著低于 CPU 和 GPU。

快速上线和向前兼容,一个 FPU 的设计

如果你来设计 TPU除了满足上面的深度学习的推断特性之外,还有什么是你要重点考虑的呢你可以停下来思考一下,然后再继续往下看

不知道你的答案是什么,我的第一反应是有两件事情必须要考虑,第一个是 TPU 要有向前兼容性第二个是希望 TPU 能够尽早上线。我下面说说我考虑这两点的原因

第一点,向前兼容在计算机产业界里,因为没有考虑向前兼容惨遭失败的产品数不胜数。典型的有安腾处理器所以,TPU 并没有设计成一个独立的“CPU“而是设计成一块像显卡一样,插在主板 PCI-E 接口上嘚板卡更进一步地,TPU 甚至没有像我们之前说的现代 GPU 一样设计成自己有对应的取指令的电路,而是通过 CPU向 TPU 发送需要执行的指令。

这两個设计使得我们的 TPU 的硬件设计变得简单了,我们只需要专心完成一个专用的“计算芯片”就好了所以,TPU 整个芯片的设计上线时间也就縮短到了 15 个月不过,这样一个 TPU其实是第 26 讲里我们提过的 387 浮点数计算芯片,是一个像 FPU(浮点数处理器)的协处理器(Coprocessor)而不是像 CPU 和 GPU 这樣可以独立工作的 Processor

专用电路和大量缓存适应推断的工作流程

明确了 TPU 整体的设计思路之后,我們可以来看一看TPU 内部有哪些芯片和数据处理流程。我在文稿里面放了 TPU 的模块图和对应的芯片布局图,你可以对照着看一下

你可以看箌,在芯片模块图里面有单独的矩阵乘法单元(Matrix Multiply Unit)、累加器(Accumulators)模块、激活函数(Activation)模块和归一化 / 池化(Normalization/Pool)模块。而且这些模块是顺序串联在一起的。

这是因为一个深度学习的推断过程,是由很多层的计算组成的而每一个层(Layer)的计算过程,就是先进行矩阵乘法洅进行累加,接着调用激活函数最后进行归一化和池化。这里的硬件设计呢就是把整个流程变成一套固定的硬件电路。这也是一个 ASIC 的典型设计思路其实就是把确定的程序指令流程,变成固定的硬件电路

接着,我们再来看下面的芯片布局图其中控制电路(Control)只占了 2%。这是因为TPU 的计算过程基本上是一个固定的流程。不像我们之前讲的 CPU 那样有各种复杂的控制功能,比如冒险、分支预测等等

相比于矩阵乘法单元,累加器、实现激活函数和后续的归一 / 池化功能的激活管线(Activation Pipeline)也用得不多这是因为,在深度学习推断的过程中矩阵乘法的计算量是最大的,计算也更复杂所以比简单的累加器和激活函数要占用更多的晶体管。

而统一缓冲区(Unified Buffer)则由 SRAM 这样高速的存储设備组成。SRAM 一般被直接拿来作为 CPU 的寄存器或者高速缓存我们在后面的存储器部分会具体讲。SRAM 比起内存使用的 DRAM 速度要快上很多但是因为电蕗密度小,所以占用的空间要大很多统一缓冲区之所以使用 SRAM,是因为在整个的推断过程中它会高频反复地被矩阵乘法单元读写,来完荿计算

可以看到,整个 TPU 里面每一个组件的设计,完全是为了深度学习的推断过程设计出来的这也是我们设计开发 ASIC 的核心原因:用特淛的硬件,最大化特定任务的运行效率

细节优化使用 8 Bits 数据

除了整个 TPU 的模块设计和芯片布局之外,TPU 在各个细节上也充分考虑了自己的应用场景我们可以拿里面的矩阵乘法单元(Matrix Multiply Unit)来作为一个例子。

如果你仔细一点看的话会发现这个矩阵乘法单元,沒有用 32 Bits 来存放一个浮点数而是只用了一个 8 Bits 来存放浮点数。这是因为在实践的机器学习应用中,会对数据做(Normalization)和(Regularization)的处理这两个操作呢,会使得我们在深度学习里面操作的数据都不会变得太大通常来说呢,都能控制在 -3 到 3 这样一定的范围之内

因为这个数值上的特征,我们需要的浮点数的精度也不需要太高了32 位浮点数的精度,差不多可以到 1/1600 万如果我们用 8 位或者 16 位表示浮点数,也能把精度放到 2^6 或鍺 2^12也就是 1/64 或者 1/4096。在深度学习里常常够用了。特别是在模型推断的时候要求的计算精度,往往可以比模型训练低所以,8 Bits 的矩阵乘法器就可以放下更多的计算量,使得 TPU 的推断速度更快

用数字说话TPU 的应用效果

那么,综合了这么多优秀设计点嘚 TPU实际的使用效果怎么样呢?不管设计得有多好最后还是要拿效果和数据说话。俗话说是骡子是马,总要拿出来溜溜啊

Google 在 TPU 的论文裏面给出了答案。一方面在性能上,TPU 比现在的 CPU、GPU 在深度学习的推断任务上要快 15~30 倍。而在能耗比上更是好出 30~80 倍。另一方面Google 已经鼡 TPU 替换了自家数据中心里 95% 的推断任务,可谓是拿自己的实际业务做了一个明证

FPGA 本质上是一个可以通过编程,来控制硬件电路的芯片我们通过用 LUT 这样的存储设备,来代替需要的硬连线的电路有了可编程的逻辑门,然后把很多 LUT 和寄存器放在一起变成一个更复杂的逻輯电路,也就是 CLB然后通过控制可编程布线中的很多开关,最终设计出属于我们自己的芯片功能FPGA,常常被我们用来进行芯片的设计和验證工作也可以直接拿来当成专用的芯片,替换掉 CPU 或者

相比 FPGAASIC 在“专用”上更进一步。它是针对特定的使用场景设计出来的芯片比如,攝像头、音频、“挖矿”或者深度学习虽然 ASIC 的研发成本高昂,但是生产制造成本和能耗都很低所以,对于有大量需求的专用芯片用 ASIC 昰很划得来的。而在 FPGA 和 ASIC 之间进行取舍就要看两者的整体拥有成本哪一个更低了。

第一代 TPU是为了做各种深度学习的推断而设计出来的,並且希望能够尽早上线这样,Google 才能节约现有数据中心里面的大量计算资源

从深度学习的推断角度来考虑,TPU 并不需要太灵活的可编程能仂只要能够迭代完成常见的深度学习推断过程中一层的计算过程就好了。所以TPU 的硬件构造里面,把矩阵乘法、累加器和激活函数都做荿了对应的专门的电路

为了满足深度学习推断功能的响应时间短的需求,TPU 设置了很大的使用 SRAM 的 Unified Buffer(UB)就好像一个 CPU 里面的寄存器一样,能夠快速响应对于这些数据的反复读取

为了让 TPU 尽可能快地部署在数据中心里面,TPU 采用了现有的 PCI-E 接口可以和 GPU 一样直接插在主板上,并且采鼡了作为一个没有取指令功能的协处理器就像 387 之于 386 一样,仅仅用来进行需要的各种运算

在整个电路设计的细节层面,TPU 也尽可能做到了優化因为机器学习的推断功能,通常做了数值的归一化所以对于矩阵乘法的计算精度要求有限,整个矩阵乘法的计算模块采用了 8 Bits 来表礻浮点数而不是像 Intel CPU 里那样用上了 32 Bits。

最终综合了种种硬件设计点之后的 TPU,做到了在深度学习的推断层面更高的能效比按照 Google 论文里面给絀的官方数据,它可以比 CPU、GPU 快上 15~30 倍能耗比更是可以高出 30~80 倍。而 TPU也最终替代了 Google 自己的数据中心里,95% 的深度学习推断任务

上卋纪 60 年代,计算机还是异常昂贵的设备实际的计算机使用需求要面临两个挑战。

第一计算机特别昂贵,我们要尽可能地让计算机忙起來一直不断地去处理一些计算任务。

第二很多工程师想要用上计算机,但是没有能力自己花钱买一台所以呢,我们要让很多人可以囲用一台计算机

为了应对这两个问题,的计算机就应运而生了

无论是个人用户,还是一个小公司或者小机构你都不需偠花大价钱自己去买一台电脑。你只需要买一个输入输出的终端就好像一套鼠标、键盘、显示器这样的设备,然后通过电话线连到放茬大公司机房里面的计算机就好了。这台计算机会自动给程序或任务分配计算时间。你只需要为你花费的“计算时间”和使用的电话线蕗付费就可以了比方说,比尔·盖茨中学时候用的学校的计算机,就是 GE 的分时系统

从“黑色星期五”到公有云

現代公有云上的系统级虚拟机能够快速发展,其实和分时系统的设计思路是一脉相承的这其实就是来自于电商巨头亚马逊大量富余的计算能力。

和国内有“双十一”一样美国会有感恩节的“(Black Friday)”和“(Cyber Monday)”,这样一年一度的大型电商促销活动几天的活动期间,会有夶量的用户进入亚马逊这样的网站看商品、下订单、买东西。这个时候整个亚马逊需要的服务器计算资源可能是平时的数十倍。

于是亚马逊会按照“黑色星期五”和“网络星期一”的用户访问量,来准备服务器资源这个就带来了一个问题,那就是在一年的 365 天里有 360 忝这些服务器资源是大量空闲的。要知道这个空闲的服务器数量不是一台两台,也不是几十几百台根据媒体的估算,亚马逊的云服务器 AWS 在 2014 年就已经超过了 150 万台到了 2019 年的今天,估计已经有超过千万台的服务器

平时有这么多闲着的服务器实在是太浪费了,所以亚马逊僦想把这些服务器给租出去。出租物理服务器当然是可行的但是却不太容易自动化,也不太容易面向中小客户

直接出租物理服务器,意味着亚马逊只能进行服务器的“整租”这样大部分中小客户就不愿意了。为了节约数据中心的空间亚马逊实际用的物理服务器,大蔀分多半是强劲的高端 8 核乃至 12 核的服务器想要租用这些服务器的中小公司,起步往往只需要 1 个 CPU 核心乃至更少资源的服务器一次性要他們去租一整台服务器,就好像刚毕业想要租个单间结果你非要整租个别墅给他。

这个“整租”的问题还发生在“时间”层面。物理服務器里面装好的系统和应用不租了而要再给其他人使用,就必须清空里面已经装好的程序和数据得做一次“重装”。如果我们只是暂時不用这个服务器了过一段时间又要租这个服务器,数据中心服务商就不得不先重装整个系统然后租给别人。等别人不用了再重装系统租给你,特别地麻烦

其实,对于想要租用服务器的

用户来说最好的 体验不是租房子,而是住酒店我住一天,我就付一天的钱這次是全家出门,一次多定几间酒店房间就好啦

而这样的需求,用虚拟机技术来实现再好不过了。虚拟机技术使得我们可以在一台粅理服务器上,同时运行多个虚拟服务器并且可以动态去分配,每个虚拟服务器占用的资源对于不运行的虚拟服务器,我们也可以把這个虚拟服务器“关闭”这个“关闭”了的服务器,就和一个被关掉的物理服务器一样它不会再占用实际的服务器资源。但是当我們重新打开这个虚拟服务器的时候,里面的数据和应用都在不需要再重新安装一次。

那虚拟机技术到底是怎么一回事呢下面我带你具体来看一看,它的技术变迁过程好让你能更加了解虚拟机,从而更好地使用它

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

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

在这个过程中峩们把原先的操作系统叫作宿主机(Host),把能够有能力去模拟指令执行的软件叫作模拟器(Emulator),而实际运行在模拟器上被“虚拟”出来嘚系统呢我们叫客户机(Guest VM)。

这个方式其实和运行 Java 程序的 Java 虚拟机很像。只不过Java 虚拟机运行的是 Java 自己定义发明的中间代码,而不是一個特定的计算机系统的指令

这种解释执行另一个系统的方式,有没有真实的应用案例呢当然是有的,如果你是一个 Android 开发人员你在开發机上跑的 Android 模拟器,其实就是这种方式如果你喜欢玩一些老游戏,可以注意研究一下很多能在 Windows 下运行的游戏机模拟器,用的也是类似嘚方式

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

不过这个方式也有两个明显的缺陷。第一个是我们做不到精确的“模拟”。很多的老旧的硬件的程序运行要依赖特定的电路乃至电路特有的时钟頻率,想要通过软件达到 100% 模拟是很难做到的第二个缺陷就更麻烦了,那就是这种解释执行的方式性能实在太差了。因为我们并不是直接把指令交给 CPU 去执行的而是要经过各种解释和翻译工作。

所以虽然模拟器这样的形式有它的实际用途。甚至为了解决性能问题也有類似于 Java 当中的 JIT 这样的“编译优化”的办法,把本来解释执行的指令编译成 Host 可以直接运行的指令。但是这个性能还是不能让人满意。毕竟我们本来是想要把空余的计算资源租用出去的。如果我们空出来的计算能力算是个大平层结果经过模拟器之后能够租出去的计算能仂就变成了一个格子间,那我们就划不来了

所以,我们希望我们的虚拟化技术能够克服上面的模拟器方式的两個缺陷。同时我们可以放弃掉模拟器方式能做到的跨硬件平台的这个能力。因为毕竟对于我们想要做的云服务里的“服务器租赁”业务來说中小客户想要租的也是一个 x86 的服务器。而另外一方面他们希望这个租用的服务器用起来,和直接买一台或者租一台物理服务器没囿区别作为出租方的我们,也希望服务器不要因为用了虚拟化技术而在中间损耗掉太多的性能。

所以首先我们需要一个“全虚拟化”的技术,也就是说我们可以在现有的物理服务器的硬件和操作系统上,去跑一个完整的、不需要做任何修改的客户机操作系统(Guest OS)那么,我们怎么在一个操作系统上再去跑多个完整的操作系统呢?答案就是我们自己做软件开发中很常用的一个解决方案,就是加入┅个中间层在虚拟机技术里面,这个中间层就叫作虚拟机监视器英文叫

如果说我们宿主机的 OS 是房东的话,这个虚拟机监视器呢就好潒一个二房东。我们运行的虚拟机都不是直接和房东打交道,而是要和这个二房东打交道我们跑在上面的虚拟机呢,会把整个的硬件特征都映射到虚拟机环境里这包括整个完整的 CPU 指令集、I/O 操作、中断等等。

既然要通过虚拟机监视器这个二房东我们实际的指令是怎么落到硬件上去实际执行的呢?这里有两种办法也就是 Type-1 和 Type-2 这两种类型的虚拟机。

我们先来看 Type-2 类型的虚拟机在 Type-2 虚拟机里,我们上面说的虚擬机监视器好像一个运行在操作系统上的软件你的客户机的操作系统呢,把最终到硬件的所有指令都发送给虚拟机监视器。而虚拟机監视器又会把这些指令再交给宿主机的操作系统去执行。

那这时候你就会问了这和上面的模拟器看起来没有那么大分别啊?看起来峩们只是把在模拟器里的指令翻译工作,挪到了虚拟机监视器里没错,Type-2 型的虚拟机更多是用在我们日常的个人电脑里,而不是用在数據中心里

在数据中心里面用的虚拟机,我们通常叫作 Type-1 型的虚拟机这个时候,客户机的指令交给虚拟机监视器之后呢不再需要通过宿主机的操作系统,才能调用硬件而是可以直接由虚拟机监视器去调用硬件。

另外在数据中心里面,我们并不需要在 Intel x86 上面去跑一个 ARM 的程序而是直接在 x86 上虚拟一个 x86 硬件的计算机和操作系统。所以我们的指令不需要做什么翻译工作,可以直接往下传递执行就好了所以指囹的执行效率也会很高。

所以在 Type-1 型的虚拟机里,我们的虚拟机监视器其实并不是一个操作系统之上的应用层程序而是一个嵌入在操作系统内核里面的一部分。无论是 KVM、XEN 还是微软自家的 Hyper-V其实都是系统级的程序。

因为虚拟机监视器需要直接和硬件打交道所以它也需要包含能够直接操作硬件的驱动程序。所以 Type-1 的虚拟机监视器更大一些同时兼容性也不能像 Type-2 型那么好。不过因为它一般都是部署在我们的数據中心里面,硬件完全是统一可控的这倒不是一个问题了。

Docker:新时代的最佳选择?

虽然Type-1 型的虚拟机看起来已经沒有什么硬件损耗。但是这里面还是有一个浪费的资源。在我们实际的物理机上我们可能同时运行了多个的虚拟机,而这每一个虚拟機都运行了一个属于自己的单独的操作系统。

多运行一个操作系统意味着我们要多消耗一些资源在 CPU、内存乃至磁盘空间上。那我们能鈈能不要多运行的这个操作系统呢

其实是可以的。因为我们想要的未必是一个完整的、独立的、全虚拟化的虚拟机我们很多时候想要租用的不是“独立服务器”,而是独立的计算资源在服务器领域,我们开发的程序都是跑在 Linux 上的其实我们并不需要一个独立的操作系統,只要一个能够进行资源和环境隔离的“独立空间”就好了那么,能够满足这个需求的解决方案就是过去几年特别火热的 Docker 技术。使鼡 Docker 来搭建微服务可以说是过去两年大型互联网公司的必经之路了。

在实践的服务器端的开发中虽然我们的应用环境需要各种各样不同嘚依赖,可能是不同的 PHP 或者 Python 的版本可能是操作系统里面不同的系统库,但是通常来说我们其实都是跑在 Linux 内核上的。通过 Docker我们不再需偠在操作系统上再跑一个操作系统,而只需要通过容器编排工具比如 Kubernetes 或者 Docker Swarm,能够进行各个应用之间的环境和资源隔离就好了

这种隔离資源的方式呢,也有人称之为“操作系统级虚拟机”好和上面的全虚拟化虚拟机对应起来。不过严格来说Docker 并不能算是一种虚拟机技术,而只能算是一种资源隔离的技术而已

我们现在的云服务平台上,你能够租到的服务器其实都是虚拟机而不是物理机。而正是虚擬机技术的出现使得整个云服务生态得以出现。

虚拟机是模拟一个计算机系统的技术而其中最简单的办法叫模拟器。我们日常在 PC 上进荇 Android 开发其实就是在使用这样的模拟器技术。不过模拟器技术在性能上实在不行所以我们才有了虚拟化这样的技术。

在宿主机的操作系統上运行一个虚拟机监视器,然后再在虚拟机监视器上运行客户机的操作系统这就是现代的虚拟化技术。这里的虚拟化技术可以分成 Type-1 囷 Type-2 这两种类型

Type-1 类型的虚拟化机,实际的指令不需要再通过宿主机的操作系统而可以直接通过虚拟机监视器访问硬件,所以性能比 Type-2 要好而 Type-2 类型的虚拟机,所有的指令需要经历客户机操作系统、虚拟机监视器、宿主机操作系统所以性能上要慢上不少。不过因为经历了宿主机操作系统的一次“翻译”过程它的硬件兼容性往往会更好一些。

今天即使是 Type-1 型的虚拟机技术,我们也会觉得有一些性能浪费我們常常在同一个物理机上,跑上 8 个、10 个的虚拟机而且这些虚拟机的操作系统,其实都是同一个 Linux Kernel 的版本于是,轻量级的 Docker 技术就进入了我們的视野Docker 也被很多人称之为“操作系统级”的虚拟机技术。不过 Docker 并没有再单独运行一个客户机的操作系统而是直接运行在宿主机操作系统的内核之上。所以Docker 也是现在流行的微服务架构底层的基础设施。

EA.Game.RegFix他可能会提示你根目录不能有Φ文,

你把文件夹里中文都改了就

行或删了若不行再打开

你对这个回答的评价是?

下载百度知道APP抢鲜体验

使用百度知道APP,立即抢鲜体驗你的手机镜头里或许有别人想知道的答案。

我要回帖

更多关于 战地2怎么设置中文 的文章

 

随机推荐