【计算机硬件知识简介】之CPU指令集
随着华为被美国多轮制裁,大家忽然发现原来国内在半导体硬件方面的差距居然如此之大。半导体硬件相关方面的关注度前所未有,为了更好地理解计算机运行的原理,本文翻译自耶鲁大学的PCLT网站,旨在介绍关于计算机运行的一些原理知识。
本文介绍的是CPU指令集相关的内容。
CPU指令集简介
一个计算机芯片可以做简单的算术,比较数字,并在内存中移动数字。其他一切,从文字处理到浏览网页,都由使用这些基本指令的程序完成。CPU通过三种方式变得更快。首先,更好的设计可以更快地完成简单的操作。第二,更好的设计可以在CPU的不同区域同时进行多达六个简单操作。第三,由于如果CPU不得不等待来自较慢的内存的数据,就会损失很多时间,因此,减少内存等待时间的技术似乎可以加快CPU的速度。
所有的一切都是数字(但这不是数学)
在硬件层面上,计算机执行的都是单条指令连在一起的序列。每条指令告诉计算机对两个数字进行加、减、乘、除,比较数字是否相等或哪个更大,并在CPU和内存中的某个位置之间移动数字。其余的指令主要是一些内务处理。
计算机中的一切都以数字表示。每个内存位置都有一个数字 “地址 “来标识它。每个I/O设备(磁盘、CD、键盘、打印机)都有一个指定的地址数字范围。在键盘上按下的每一个键都会产生数字。计算机显示器上的每一个点都有一个地址,点的颜色由三个数字表示,这些数字混合了红、绿、蓝的原始颜色。声音被表示为一个数字流。
考虑一下文字处理器中的自动纠错功能。如果你输入的是 “teh”,计算机似乎能识别这个常见的错别字,并将其改为 “the”。 这与数字有什么关系?你输入的每一个字符,包括空格键,都会向计算机传输一个代码。该代码是ASCII,在该代码中,空白是32,”a “是97,”z “是122。因此,计算机将 “teh “视为32 116 101 104 32的序列。文字处理器已经被编程为检查这个序列,当它看到这个序列时,就会交换101和104。CPU芯片不知道拼写,但它处理数字的速度非常快,而且很准确。
这时你可能会想,计算机的速度是由它的加法速度决定的。 人们期望如此,因为加大数需要我们花很长时间。问别人2+2是多少,他们会马上回答4。询问154373+382549是多少,他们会停顿一分钟并拿出一支铅笔。计算机用电子电路添加数字,对大数字或小数字的工作速度一样快。算术是计算机最擅长的,而且它们几乎是瞬间完成。
如果我让你做2+2的加法,你可以立即完成。现在假设我把两个数字放在你房子的不同房间里,把房间的名字写在一张纸上,把纸放在一个信封里,然后问你需要多长时间才能找到这些数字并把它们加起来。直到你打开纸,发现数字在哪里,你才会知道。如果有些数字是在附近的其他房子里,而我把房子的地址写在纸上,而不是只写房间的名字,情况就会变得更糟。
CPU有不同的地方来存储数字。它有8或16个 “寄存器”,完全不需要延迟。它有 “L1缓存”,几乎是瞬时的,还有L2缓存,只是稍慢一些。然后它有主存储器。如今,内存的速度非常快,但与CPU的速度相比,它是如此之慢,以至于你浪费了数百条指令来等待响应。
计算机通过一连串的步骤来处理指令。首先,你必须读取下一条指令本身,它可能在缓存中,也可能在内存中,必须被取走。然后计算机对指令进行解码,以确定要做什么,更重要的是需要知道指令需要的数据在哪里。它可能在寄存器、L1高速缓存、L2高速缓存或内存中。CPU必须获取数据,然后将指令交给其中一个处理单元。有许多初步步骤,然后是几个处理步骤。因此,CPU通过一个 “流水线 “来处理指令,其行为就像一条装配线(工作来到工人面前)或像一条食堂生产线(用户来到食物面前)。
衡量CPU的标准是它在一秒钟内能处理多少条指令,而不是处理任何一条指令需要多长时间。考虑一下一个快餐柜台。他们有一堆队伍,几个人在柜台工作,后面还有很多人在做食物。他们用在任何时间段内为多少顾客服务来衡量自己。当你走到队伍的前面时,你想要的东西可能暂时没有了,你不得不靠边站。你可能需要异常长的时间才能拿到你的汉堡,但在此期间有很多人在接受服务。对你来说,服务很慢。对企业来说,他们正在运送大量的人通过。
同样,CPU的设计是为了获取程序、获取数据和执行指令。有时,某条指令需要的数据并不是立即可用的。所有的现代处理器都可以把指令推到一边,让它在后续指令的服务中等待。速度是由芯片的整体吞吐量来衡量的。
高中生的比喻
第一代PC的CPU芯片就像一个单间的校舍。一个班级的学生可以进入并入座。第一节课是英语。下课铃响后,他们换书,上一节数学课。然后是历史,一种语言,最后是科学。上完最后一节课后,一天的学习就结束了。然而,在电脑版的 “学校 “中,另一班学生立即进入大楼,开始他们的科目。
如果你想让学校更有效地教育学生,你可以尝试缩短课时(加快时钟的速度)。然而,你也可以通过建造更多的教室来加快进度。这就是286、386和486代芯片的情况。在像486那样设计的学校里,每个科目都有一个教室。当铃声响起时,英语教室的学生转到数学教室,数学教室的学生转到历史教室,以此类推。最后一个班级—科学班的学生离开学校。一个新的班级进入并在英语教室坐下来,开始他们的科目顺序。
每一代新的芯片通常是上一代芯片电路数量的三倍。因此,第五代芯片,即奔腾,增加了完整的第二套教室。现在,两组学生将同时学习每个科目。
如果说前五代CPU像小学,然后是高中,那么奔腾II之后的处理器就有点像大学。芯片有一些数量较大的内部指令处理站。有些处理整数,有些处理浮点数。指令进入执行阶段,并被赋予它们需要执行的操作序列。从某种意义上说,指令在站与站之间徘徊,具有一定程度的独立性。有些指令很快就能完成,有些则需要更长时间。然而,有一条规则是,指令必须按照它们开始的顺序结束。所以快速完成的指令必须在出口处等待之前进入的较慢的指令完成。
这个比喻也解释了关于时钟速率的一个重要细节。加快时钟速度并没有告诉计算机要做什么事情。每个电路都尽可能快地执行其操作。时钟告诉这些电路何时开始下一组操作。如果时钟速度过快,在前一个操作完成之前就开始下一个操作,数据被破坏,系统就会崩溃。
从属指令
假设你想把三个数字加在一起。
5 + 22 + 7
一个人和一个电脑程序会先把5加到22得到27。然后把27加到7得到34。两个操作被执行。由于第二个操作使用了第一个操作的结果(27),所以它们必须按顺序进行。
现在考虑把四个数字加在一起。
5 + 22 + 7 + 18
一个人将通过附加第三个操作来完成,将前两个操作计算出的34加到18,得到52。然而,计算机可以同时进行一个以上的数字运算,只要这两个运算是相互独立的。因此,如果你想为一台现代PC优化,你将把指令安排如下
加5和22 (27)
加7和18 (25)
将前两步的结果,即27和25,加在一起(52)。
由于步骤1和2不依赖于彼此的结果,它们可以同时运行。步骤3需要前面两个步骤的结果,所以它在下一个周期运行。因此,计算机可以在两个周期内将四个数字加在一起,而这两个周期只需将三个数字加在一起,因为前两个操作可以同时在第一个周期内运行。
最初的奔腾芯片可以同时执行两条指令,只要它们不是相互依赖的。这需要程序员或编译器将指令安排在一个最佳顺序。奔腾II、III和奔腾4的CPU芯片在内部重新安排指令,当它们不依赖于先前的结果时,所以优化并不那么依赖于程序的编码方式。
寄存器
在过去四十年里设计的所有计算机都在 “寄存器 “中保存数据。如果你要把一列数字加起来,寄存器就会保存运行中的总数。如果你正在扫描一份文件以查找拼写错误,寄存器会记录你在文件中的位置。
最初的16位英特尔CPU设计有非常少的高度专业化的寄存器,由字母组成。碰巧的是,这些字母与描述其用途的单词有关。如果你要把电子表格中的一列数字加起来,A寄存器 “累积 “总数,B寄存器是 “基数”,指向该列或单元,C寄存器持有剩余单元数的 “计数”。
1986年,英特尔推出了带有一套新的32位指令的386 CPU。原来的七个高度专业化的16位寄存器变成了七个基本上可以互换的通用寄存器。然而,直到九年后,微软才发布了一个普遍可用的操作系统(Windows 95),该系统使用了386指令和寄存器。
386芯片的32位指令集已经存活了近20年。同时,摩尔定律告诉我们,芯片上的电路数量大约每18个月翻一番。硬件比所有的软件更容易改变。一个现代的CPU芯片有很多7个以上的寄存器,但用户甚至操作系统都看不到它们。
一个程序可能有一连串的操作,一个接一个地将不同的总数 “累积 “到A寄存器中。在每个步骤中,不同的 “计数 “可能被加载到 “C “寄存器中。然而,这些操作中的每一个都可能是独立的。CPU可能认识到这一点,并通过允许操作并行运行来加快处理速度。这样做时,CPU会指定两个实数寄存器假装成一组操作的A和C寄存器,而另一对实数寄存器则假装成不同操作的A和C。当然,这种假装很复杂,而且只能进行到这里。
2004年,AMD推出了具有64位指令集的Athlon 64系列处理器。起初英特尔抵制,但它终于屈服了,克隆了AMD的操作设计。服务器程序受益于使用超过4千兆字节的内存的能力,毕竟这只是价值约400美元的内存。然而,对于每一种类型的程序来说,新的64位指令更重要的特点可能是一组新的8个寄存器,编译器现在可以用来优化程序执行。由于有了额外的寄存器,一些程序的运行速度提高了20%到30%。
内存访问延时
内存的速度比CPU慢很多。如果一条指令需要计算机主存储器中的数据,它可能需要等待一段时间,相当于处理数百条指令的时间。由于后面的一些指令将取决于这个前一个操作的结果,CPU将停止等待内存。
为了解决这个问题,CPU有两种内部高速存储器,用来保存最近使用的指令和数据。这种高速存储器被称为 “高速缓存”。
最好的内部存储器类型是一级(L1)高速缓存。这种存储器与解码指令和执行算术的单元一起是CPU核心的一部分。如果指令和数据都在L1缓存中,那么CPU就能以全速执行。现代英特尔处理器有32K的L1内部高速缓存。AMD的竞争处理器甚至有更多。
当指令或数据没有在L1缓存中找到时,现代处理器有更多的二级缓存与每个CPU核心相关。2007年期间常见的65纳米一代英特尔处理器有2或4兆字节的二级缓存。2008年期间推出的下一代45纳米处理器将拥有更大的二级缓存。
每个二级缓存都与一个特定的处理器内核相联系。一些CPU芯片有一个额外的三级缓存,由所有CPU内核共享。最终,一条指令需要的数据不在任何一级高速缓存中,所以它必须从内存中获取数据。
计算机的主存储器是同步动态随机存取存储器(SDRAM)。随机存取意味着内存中的任何位置都可以在任何其他位置之后使用。动态随机存取指的是一种提供大量内存的架构,但其速度比缓存中使用的 “静态 “内存架构要慢。同步是指内存以一个由外部时钟决定的固定速度传输数据,就像上课的音乐学生与滴答作响的节拍器保持同步。
在计算机生成所需内存位置的地址后,在内存开始响应之前有一个被称为 “延迟 “的延迟。然后它以额定的时钟速度传输数据。问题是,延迟是以几十纳秒为单位的,而当一个现代的CPU每纳秒可以执行12到24条指令。
延迟是性能杀手。在从一个新地址获取一个新的数据字节的时间里,CPU可能已经执行了数百条指令。通过重新安排不依赖该内存获取结果的后续指令,CPU可能会继续运行几十条指令,但随后就会停止。即使L1和L2缓存处理了CPU内部99.5%以上的数据需求,延迟可能意味着一个典型工作负载的CPU在没有执行任何指令的情况下,有一半时间在等待内存的响应。
内存条上最明显的数字是其时钟速度。DDR 4内存的额定频率是2100MHz。然后,延迟是以这些时钟刻度来表示的。有几个延时数字,但最重要的是CAS延时。如果你把时钟的速度提高了一倍,但同时也把CAS延迟提高了一倍,那么更高的时钟速度其实并没有起到什么作用。从DDR2到DDR3再到DDR4,供应商一直在提高时钟速度,然后增加CAS延迟的数字,以便 “更快的 “内存需要完全相同的10到13纳秒来响应一个新的内存地址。
RISC架构
英特尔第一个 “芯片上的CPU “是4004处理器。它更像是一个袖珍计算器,而不是一台真正的计算机。它可以处理编码为4位的普通10进制数字。后来的芯片增加了处理8位、16位和32位数字的能力。因此,在现代英特尔CPU芯片上,没有单一的添加指令。相反,对于数字、字节和其他大小的数字都有单独的加法运算。由此产生的可能的指令集是一个混乱。这就是典型的 “复杂指令集 “计算机芯片。
在你的周日报纸上,紧挨着CompUSA的插页,可能有来自西尔斯的东西。看看广告的最后几页,在那里他们展示了工具。几乎肯定会有一张传统的 “190件套筒扳手套装 “的图片。如果你购买了这一物品,你将永远拥有适合任何工作的工具。在现实中,几乎不可能把所有的部件都整理好,而且你会花几分钟时间在所有的附件中寻找合适的尺寸。
去一家轮胎店。他们把你的车从地板上抬起来,卸下轮毂盖,然后拿起一个连接到软管上的枪形装置。”Zuuurp”,每个螺栓都会从车轮上脱落。你可以用190件套筒扳手套装做同样的事情,但每个车库都知道,汽车轮毂螺栓只有一种尺寸。所以他们不必花时间寻找合适的工具,他们可以优化他们真正需要的一个尺寸。
当计算机设计师意识到同样的事情时,它被称为精简指令集计算机或RISC。让所有的指令都有相同的大小。只使用一种尺寸的数据。简化指令,从而简化操作解码。然后利用芯片上的所有空间来优化剩下的东西,而不是用支持很少执行的指令来填充芯片。
今天,大多数手机中的处理器、XBox 360、PS/3和Wii中使用的IBM Power系列处理器,以及大型Unix服务器都代表了RISC的CPU设计理念。然而,精简指令集的优势在芯片拥有200-300万个晶体管的时期(在486芯片后期和奔腾芯片早期的时期)显得最为重要。当PowerPC首次公布时,它被标榜为 “以486的价格拥有奔腾的能力”。
每隔18个月,CPU芯片所能容纳的晶体管数量就会增加一倍。今天的CPU拥有数以亿计的晶体管。改变工作以简化计算机的设计很快就变得不重要了。今天的RISC在视频游戏机中影响最大,计算机程序是专门为硬件设计的,最大的性能值得在设计上额外投资。
管线,超级星形
虽然轮胎店在更换轮胎方面可能很快,但当你真正需要速度时,看看他们在印第安纳波利斯是如何做事的。一辆赛车驶入维修站进行维修。他们把它从地上抬起来,然后四组机械师同时对所有四个车轮进行维修。该车在几秒钟内就回到了比赛中。在普通生活中,这样的服务将是非常昂贵的。但在微电子世界中,晶体管很便宜。
管道是解码指令、获取数据、执行操作和保存结果的处理站的序列。在CPU内部,指令在一连串的工位上被处理,这些工位类似于流水线。15年前,一个CPU会分五到六个步骤处理指令。每个步骤在一个时钟周期内完成。
为了加快时钟速度,有必要将处理分解成更小的步骤,以便在更短的时钟周期内完成。一个现代的英特尔CPU可能有一条流水线,里面有40个步骤。程序中的一条指令占据了每个步骤。在时钟的每一次滴答声中,所有的指令在流水线中向前推进一步。一条指令可能在终点完成,而一条新指令可能在起点进入。
每当程序遇到分支指令时,流水线就有一个潜在的问题。这是一个决策点,程序将通过执行两条新指令的交替路径中的一条继续进行。问题是,在分支指令到达或接近流水线的末端之前,CPU不会真正知道将采取哪条路径。为了保持流水线的完整,CPU必须猜测这两条备用指令路径中的哪一条将被执行,并通过流水线开始处理。如果这个 “分支预测 “是错误的,那么部分执行的路径就必须放弃,而正确的路径必须从头进入流水线。分支预测的错误会导致CPU错过大约30个时钟周期的执行。
当计算机可以在每个时钟周期执行一条以上的指令时,它就是超标量。关于流水线的讨论谈到了每一个时钟周期有一条指令结束,一条指令开始。一个奔腾4CPU实际上可以在一个时钟周期内启动或终止三条指令。沿着流水线,大部分的处理步骤都是重复的。CPU可以同时添加两对或更多的数字。
然而,使奔腾4或AMD CPU如此复杂的一个原因是,这种一次执行一条以上指令的能力必须完全隐藏在程序中。程序被写成一个接一个地执行指令,而CPU产生的结果也完全复制了这种行为。因此,为了使用额外的处理能力,CPU芯片必须有大量复杂的控制逻辑,以检测程序被写成一个接一个执行的两条指令何时实际上是独立的,真的可以在同一时间执行。
SIMD
在一台典型的家用电脑中,有两个处理单元。CPU是由英特尔或AMD制造的,它是你通常听到的芯片。然而,在大多数系统中,实际上还有第二个芯片,在原始计算能力方面,它是一个更强大的计算机。它就是显卡上的主芯片,即图形处理单元或GPU。
GPU不是那种你可以为其编写操作系统或应用程序的通用计算机。它反复做少量的事情,但做这些事情时速度非常快。它也有一些本地内存,可能比你的计算机的主内存更快。
是什么让GPU如此强大?数据以一组点的形式显示在屏幕上。每个点由三个数字表示,代表三种颜色。三维应用程序(主要是视频游戏)执行数学运算,以计算屏幕上某些区域中每个点的每种颜色的正确值。视频图像被压缩到DVD或HDTV的MPEG 2流中,通过比较相邻点的颜色,通过试验和错误找到一个数学序列,可以产生相同的图像模式,同时占用相当少的内存。
这总是可以一次完成一条指令,但这是重复性的。更重要的是,无论你对一个点做什么,你也必须对下一个点和后一个点做什么。
在广场舞中,有人站在麦克风前喊出下一个步骤。所有的舞者齐声做同样的事情,然后呼唤者宣布另一个步骤。
你可以用同样的方式设计一个处理单元。处理器的一个部分读取程序并决定下一个操作应该是什么。然而,与PC CPU不同,该指令并不适用于一个数字或一对数字。相反,一整行的数字已经被加载到单元中,这条指令同时适用于所有的数字。这被称为SIMD,即 “单指令,多数据”。三十年前,在大房间大小的大型计算机上,它被称为 “矢量处理”。
15年前,第一个SIMD芯片开始在个人电脑中使用。它们还没有强大到可以用于视频应用,但它们可以为复杂得多的音频数据处理提供支持。这种芯片被称为DSP,即 “数字信号处理器”。它们可用于从计算机调制解调器到去除老式留声机唱片上的划痕的一切。今天,CPU和SIMD要快得多,功能也更强大。
英特尔和AMD的CPU芯片中内置有少量的SIMD能力。它被用来支持多媒体和游戏。在英特尔芯片中,它被称为MMX、SSE、SSE2和SSE3。AMD的SIMD被称为 “3DNow!”,和英特尔一样,它已经经历了几代。
一些供应商正在建造专门的SIMD CPU芯片,它们介于GPU的高度专业化设计和CPU的一般设计之间。索尼和IBM正在合作开发用于Playstation 3的 “Cell “处理器。较小的供应商提供可以插入传统PC的板卡,以加快游戏或科学计算的处理速度。
CPU市场
在2000年以前,CPU芯片的速度每两年就会增加一倍或两倍。后来问题发展了,在过去的十年里,CPU的速度没有什么变化,尽管每一代新的处理器耗电更少,电池寿命更长。
当然,累积的小变化也带来了一些改善。在过去8年中,我们已经从2.5GHz的速度变成了标准系统的4GHz速度。这是进步,但不是我们在早期看到的那种革命性的变化。
幸运的是,程序只在一些常见的模式下使用CPU。
一个运行Office或网络浏览器的互动用户只在短时间内使用CPU。计算机坐在那里等待下一个按键,或者等待一些数据通过网络到达。如果CPU能够在0.01秒而不是0.02秒内做出反应,人类就不会注意到这种差别。
一台处理视频数据流或运行视频游戏的计算机有大量的处理工作要做。CPU是100%的忙碌。大多数时候,程序从数据流中获取下一个字节的数据。内存访问是可以预测的,所以CPU很少需要等待对随机内存位置的意外引用。
然而,一台作为网络或应用服务器的计算机,代表成千上万的远程用户请求运行数百个小程序。没有一个请求会使用大量的CPU。没有办法预测下一个请求或它将需要的内存数据。这是一种CPU最可能需要等待内存响应数据的使用模式,而且由于服务器处理如此多的远程用户,这也是性能最重要的情况。如果CPU支持超线程,那么当一个线程的指令阻塞等待内存时,CPU中还有一个完全不同的线程,其独立的指令集能够执行,直到内存响应,或者运气不好的话,直到第二个线程也阻塞等待内存。
目前英特尔有五个系列的CPU芯片。
酷睿i3、i5、i7(”主流”)。插入插座(台式机)或焊接在主板上(平板电脑)。i3往往有两个核心,而i5和i7有四个核心。甜蜜点往往是高端的i5处理器,在过去五代中售价为220美元。
赛扬和奔腾(”价值”)。一种廉价的主流版本,可插入所有相同的板子。这是一种双核芯片,价格从60美元到85美元。我不明白为什么有人会在这些价格下购买低于85美元的芯片。
Atom(”超值”)。一种更便宜的芯片,用于平板电脑和 “东西”(物联网意义上的)。像手机芯片一样,Atom试图在一个芯片内结合整个主板。它不像赛扬那样强大,但对于简单的网络浏览和观看标准视频来说绰绰有余。
“移动”。各种版本的单核主流芯片,已被优化为在非常或超低功率下运行。这种芯片的一些版本将电池使用量从传统台式机的60-90瓦降至10瓦,甚至5瓦。
Xeon(”服务器”)。这是主流芯片的一个版本,经过修改后,一个主板可以有两个或更多的CPU芯片。至强也是第一个推出Quadro(4核芯片)的家族。英特尔已经展示了带有四个四核至强芯片的服务器,共提供16个CPU。
这些营销标签经历了许多代的硬件变化,所以它们反映了一种价格和目标,而不是任何特定的技术。
欢迎大家关注DataLearner官方微信,接受最新的AI技术推送
