计算机基本知识概览 II
本文信息
作者:AnterCreeper
状态:经初步审阅的草稿,审阅人:000lbh
前言
过去,现在,与可见的未来, 从人类第一台通用电子计算机,到今日的个人手机移动设备,物联网设备与云计算和数据中心, 计算技术发生且依然在继续发生翻天覆地的变化。 在历史长河中,人们发明了各种各样的技术,正是这样的创新,对计算机的高速发展作出了巨大的贡献。 不过,这些技术,留存到现在的,不多。 很多技术,在历史的长河中被淘汰。
然而,对于技术本身的态度,从人角度出发的一种价值评价,应当是谨慎和辩证的。 我们应当认识到:
- 任何的陈述是片面的,有条件的。因此价值评价也是如此。
- 实践是检验的唯一标准,但检验是有限的,条件是运动变化的。因此不能穷尽。
一些技术,过去算力不够,无法实现,因为条件不足被淘汰了。但是随着时间变化,时机成熟,又成功了。 或是,一些技术在一些领域里效果不理想,但在其他领域则大放光彩。 甚至另有一些技术,效果优异,但是由于势力和话语权较弱,或是商业不成功,最终被其他技术利益集团抹杀了。 没有一项技术能够解决万事万物,技术成功的条件因素众多,而其条件在不断的发生变化,而某些时候这种变化是较为反直觉的。 因此进行价值评价,应当认识到其存在的这些特点。
衡量计算机的指标——面向最终交付的评价
能耗与功耗
今天,对于几乎所有类型的计算机,电力是工程师面对的最大挑战。 对于一个桌面和服务器处理器,其工作电流可达到几十 A 至几百 A 不等,而对于移动端最高亦有十几 A,因此芯片管脚的电流密度很高。 而另一点,处理器运行产生的热量需要耗散,以维持芯片正常工作温度。
能耗和功耗的定义,读者应当是很容易回答的: 功耗是芯片单位时间消耗的电能,而能耗是芯片消耗单位电能完成的工作量。 在比较处理器之间的价值,后者指标似乎更好,对于手机与笔记本电脑,我们希望续航更久;而对于数据中心,我们希望相同一度电能创造更多价值。 而对于前者,功耗通常被作为计算机设计的约束条件,在各类场景下,其有着不同的数值。如对于手机,过高的功耗会导致手机过热从而使消费者不适,并影响其他组件寿命。 而对于个人电脑和服务器,其散热条件具有能力上限(如水冷比风冷散热能力更强,因此可以选用功耗更高的处理器),主板降压配电能力也有上限,芯片工作不应当超越这些约束条件,否则造成设备损毁。我们需要仔细区别这两个概念。
而一种更直观的理解,计算机是消耗电力的印钞机,电源一插,黄金万两,因此为了能产出更多的钱,我们的期待实际上是期望其消耗更多电能印更多的钱,印钱速度越高越好。但实际情况一是这一能力具有上限,二是二者的曲线具有非线性的特点,也就是具有边际效益。
处理器的热效应
通常芯片一部分功耗以如驱动信号这样的形式耗散,而剩余绝大多数功耗以热量形式散失。 常常我们能见到 TDP(热设计功耗)这个概念,其代表了在较长的持续时间下,为实现处理器能够持续运作在基础频率,需要满足的散热条件,是芯片功耗的平均预算。 产生的热量的吸收和传播需要一定时间,而芯片又往往不是长时间运行在最高负荷的情况,因此发明了睿频技术,允许在温度还不是很高的时候(实际上温度越低,芯片运行速度更快,因此有极客通过液氮冷却超频以追求最高性能),在瞬时的一些情况下通过增加电压增加功耗(相当多,很不节能!)的方式提高一瞬时的运行速度,从而降低了延迟提高了响应速度(如在一台闲置的电脑上打开 Office),改善用户体验。 通常处理器制造时会产生一些缺陷,于是导致某些处理器运行的速度较慢或不能运行,因此制造厂家为了减少损失对处理器的运行频率进行限制(也叫锁倍频。对于 Intel 处理器,没有锁倍频的通常会标有 K 字母,允许用户修改使处理器运行在任何频率下)且增加一定的电压(某些核心不仅不能运行的更快,在相同频率下也比其他核心需要更高的电压,因此体质不同的处理器功耗也存在一些差异),或屏蔽了一些功能如屏蔽了一些数量的处理器或集成显卡的核心,形成了不同的型号(如 Intel i3,i5 和 i7)。 TDP 不是因,而是果,是芯片运行时产生不得不需要散失的热量所导致的。因此对于同个型号的处理器,运行的频率越高从而性能越高,而由于频率变高电压增高(为了保证更高频率下运行不出错,不得不增加电压以加速晶体管的翻转)所以功耗也高,产生的热量更多,需要 TDP 更高的散热能力。不过对于某些设备散热条件不佳(如单管压 i9,轻薄本,被动散热的平板等),OEM 制造商或芯片制造厂家需要进一步增加额外的功耗限制,禁止处理器产生热量过多从而损毁处理器。早期 Intel 增加了一些具有不同的 TDP 限制的 SKU(面向各个场景)供给厂家使用,而后来增加了 cTDP 参数,可以由 OEM 厂家进行配置修改。 而实际上今日 OEM 制造商选择一个更好的策略:只要芯片运行温度不超过限制,就一直允许 CPU 运行在最高速度下。
性能
性能是永恒的话题。完成一项任务,时间越短越好。时间就是生命,效率就是金钱。 时间等于一个程序运行需要运行的指令数和平均每个指令运行需要的时间相乘,而后者等于 1 秒钟除以芯片运行的平均频率和每个周期平均运行的指令数量的乘积。后者每个周期平均运行的指令数量通常被成为 IPC。 对于不同的电脑,如果架构不同,程序的指令数量通常不一样。 而对于不同的处理器,芯片能够持续运行的最大平均频率和 IPC 也不同。
如何评价一个处理器的性能?这个问题是复杂的,归结为任务的复杂性和多样性。 CPU 作为一种通用处理器,通用便意味着面向日常各种各样的应用,比如视频转码编辑,游戏,文字办公,程序编译等。 不过尽管任务多种多样,但是大多数任务都具有某些种有限的特点,因此为了衡量一个 CPU 性能如何, 人们在这些各种各样的应用中选取了一些典型任务代表常见的任务情况,开发了基准测试程序,也叫 Benchmark。是骡子是马,溜一溜便知。
不过,Benchmark 不是永远有效的,有一些因素对其产生可观的影响。 其中一个重要方面是,人们意识到可以通过对抗性的针对性的优化,或者对其运行规则做出对自己有利的解读。 这里强调的是针对性和对抗性,这种调优不具有普适性,也无法表征整体性能,除了使得数字上更好看,没有什么实际价值。 但是,于此同时,需要认识到软件上的优化也是提高性能的非常重要的办法之一,如可以通过循环展开,向量化等操作获得很高的性能提升。 因此基准测试软件控制了一些可选的选项,在指定的规则框架内进行对比。 这是一个冲突性的,两面性的问题,因此需要辩证地参考,尽信书不如无书。 而典型任务也不代表全部任务,最终效果依然需要落实到实际的应用上。
另一个有趣的例子是 GPU,作为专用的协处理器完成图像处理和 3D 渲染,面向了较高并行的任务进行了优化, 在一些任务,比如视频处理深度学习等,GPU 相比通用处理器具有巨大的性能提升(从而极大的降低了成本,一张显卡的算力可以与百余核高端通用处理器相当,且相当便宜!),而在另一些任务中相差甚远,几乎不能完成。 这一例子更加强调了系统的重要思想: 设计最终目的是满足目标和功能。
基准测试
常见的 Benchmark 有如 Geekbench,Passmark,Spec2017,Cinebench,Blender Benchmark 等。 Spec2017 包括浮点和整数两个部分,前者包含如 gcc 编译器,h264 视频编解码,后者包含如 imagick 图像处理和各类科学计算等。
成本
成本是一台计算机极为重要的考核指标,并且逐渐成为当下计算机行业的一个重要主题。 但一些时候,我们总会有意无意的忽视了这个问题。
举一个比较简单的例子:一位同学,买了一台电脑,花了 3k5,用了一年损坏了,而另一个情况下,买了一台同样性能水准的电脑,花费了 3k5,用了五年而损坏。 而另外一个例子:某个同学因学习需要,由于性能和续航优异而亲睐一种以水果作为商标的某款电脑,但最终因囊中羞涩无力购买。
成本包括制造成本和运作成本,而利润是系统运行创造的价值除以其总成本减一。 随着计算机商品的大众化,其一件产品的制造成本与售价之间的差额在不断的缩小,而大多数公司的研发费用只占其收入的 4%~12%。 制造成本主要是指购买一件设备的单次投资,通常其包含了生产的成本与其他的支持成本(如配套的操作系统和软件的研发与生态的维护), 而运作成本,在互联网大型数据中心是极为重要的,其包括电费,网费,冷却的费用(如空调费),地皮空间的租金,以及设备损毁更换的开销等。
此外,我们需要注意到,成本是一个整体性的概念,是面向最终需求的解决方案不多不少,而不应当仅仅关注其内某个单一组件。 如小明需要进行深度学习的实践和学习,此外有游戏的需求,需要一台个人台式电脑。那么,他也许会更亲睐在显卡上做更多的投资。 又如小王有大量储存的需求,有许多的学习资料,故而,他选择了购买更多的机械硬盘和固态硬盘。 不管如何,这是一个权衡的艺术,而最终评价标准依然还是面向最终整体的实际效果。
一些时候,我们需要更加丰厚的利润,我们总是希望花最少的钱,办最多的事,因此需要考量我们的实际需求情况与性价比。 而实际需求和性价比也是会随着时间发生变化,因此购买也相当于对未来情况的一次投资。前言已经强调了世界运动性的这一特点。
而另一方面,成本也成为了约束条件,当无法满足则没有讨论的意义。
生态
随着时代发展硬件进步速度逐渐减慢(见后文),程序员越来越需要承担起提高程序性能的重担,对程序的优化日益显得尤为重要。 由于物理限制,处理器运行主频无法无限提升,因此提高性能的主要实现手段是增加并行性,即通过在单位时间内进行更多无关的计算。
程序优化是一个收益显著的事情。
一个程序未经修改,通过编译器的优化便能获得几倍的性能提升。而通过程序员手工进行并行化编程,程序可以获得非常高的提升:如采用 SIMD 向量指令,即单个指令可以对一个向量内每个元素进行相同操作,从而单位时间计算量增加。或采用多核系统,无关的任务(比如开视频的同时进行微信聊天)之间不存在关联被分布于多个核上从而实现并行加速,而同一程序则可以通过各个线程分而执行相互同步,以提高性能。而经过精细设计构造从而运行于 GPU 的程序,通常可以获得更高的加速比,但是由于 GPU 专用的特点,程序员需要承担很大的心智负担,从而开发调试成本增加。
而这些优化通常离不开程序员对计算机系统的理解和熟悉,这些标准有 CPU 上的 ISA(见前一章),也有 GPU 系统的如来自 NVIDIA 公司的 CUDA API 和来自 AMD 的 Rocm。一些架构较为易用,程序员负担较小,设备比较大众通用和容易获取,来自制造商的支持较多,来自社区和商业的库较为丰富,从而程序员更倾向于于这些架构开发并进行针对优化,从而导致了程序与架构的黏性。而某些架构设备较为稀有,设计复杂,几乎没有资料和制造商的支持,或是乃至程序几乎无法正常运行,这些无疑增加了开发成本,让人望而生畏。CUDA 的日益垄断日益凸显了生态的重要性。
计算机的过去,现在和未来
摩尔定律与后摩尔时代
(TODO)
Dennard Scaling Law
(TODO)
Amdahl's Law
(TODO)
计算机层次化
当今计算机系统复杂程度日益增高,为了构建高效、可维护和可扩展的系统,因此需要进行层次化。(也被称为 UNIX 哲学,但这一哲学思想不仅仅限于 UNIX 相关,可以说基本涵盖了计算机科学的方方面面。)
简单性
简单性即主张将复杂的问题分解为一系列简单的问题,然后分而治之。通过将系统分解为小的、独立的模块,每个部件只需要针对这个更小的问题进行研究,可以大幅降低复杂性,提高可维护性和可重用性。
模块化
模块化是实现简单性和可维护性的关键,每个模块负责特定的功能,之间通过接口进行交互。通过定义清晰的接口,这些模块可以相互独立地进行开发与测试,而不会对其他模块产生过多的影响,从而实现整个产业链的层次分工专攻,而模块化使得具有更多普适性,从而实现了更多的复用,减少了重复工作。
标准化
标准化原则是实现模块化原则的重要手段。通过制定统一的规范和标准,不同的模块可以实现互操作和集成。降低了风险同时保持系统的稳定性和可维护性。
在芯片制造领域,通常具有两大模式,一种称为 IDM(Integrated Device Manufacture)模式,集芯片设计、芯片制造、芯片封装和测试等多个产业链环节于一身并进行联合优化,为早期多数集成电路企业采用的模式;而一种被称为 Fabless,这些芯片公司仅实现芯片的设计工作,并将图纸交由芯片代工厂(通常成为 Fab)进行生产,后者包括有台积电(台湾积体电路制造有限公司,英文简称 TSMC)、中芯国际、三星、Global Foundries。设计和制造相分离的 Fabless 降低了设计人员的负担以及企业运行的投资和成本开销,为行业所亲睐。
而在芯片设计领域,有一些公司提供设计芯片所需要的工业软件(称为 EDA),而有另一些公司则以兜售被称为 IP 的模块谋生,这些设计模块只可以完成某些小型的特定功能,如视频输出、图像处理、内存控制器等,以黑盒子出售给各个芯片设计公司。后者通过集成各种 IP 模块与其自己的设计实现拼接组合为最终的 SoC 芯片。
在软件领域,这一现象更为普遍。人们将众多子程序集合(也称为库)单独分离出来成为一个个单独的文件,一些在程序编译链接时被其他开发者集合在一起,称为静态链接库;而另一些则是在运行时动态的被其他程序使用,则称为动态链接库。这些子程序用途广泛,有的可用于被开发图形界面如 Qt,有的则包含了视频格式的编解码算法程序,如 libx264,libsvtav1 等,而有一些库则将底层复杂的接口进一步整合抽象为更简单的函数功能。库大大方便了软件的开发,可以很容易地发布、替换或二次开发。