新型M1 Mac的真实世界体验已经开始流行。它们的运行速度很快。真快。但为什么?什么是魔术?
在YouTube上,我看到一位Mac用户去年购买了iMac。它已用完40 GB的RAM,花了他大约4000美元。他难以置信地看着自己的超贵iMac被他的新M1 Mac Mini拆毁了,他为此花了700美元。
在现实世界中的一次又一次的测试中,M1 Macs不仅超越了顶级的Intel Macs,而且还在摧毁它们。人们开始难以置信地开始问这到底是怎么可能的?
如果您是其中之一,那么您来对地方了。在这里,我计划将其分解为易于消化的部分,就像苹果公司对M1所做的一样。具体来说,我认为很多人有以下问题:
像英特尔和AMD这样的竞争对手采用相同的技术技巧有多容易?
当然,您可以尝试使用Google,但如果您尝试了解苹果公司所做的工作,除了肤浅的解释,您将很快陷入技术高度专业的术语中,例如使用非常宽的指令解码器,巨大的重排序缓冲区(ROB)等的M1除非您是CPU硬件极客,否则很多都是gobbledegook。
为了充分利用这个故事,我建议阅读我的前一篇文章:RISC和CISC意味着2020年?在这里,我解释什么是微处理器(CPU)以及各种重要概念,例如:
但是,如果您不耐烦,我将简要介绍您需要理解的材料,以帮助我理解M1芯片。
通常,当谈到英特尔和AMD的芯片时,我们谈论的是中央处理器(CPU)或微处理器。正如您可以在我的RISC vs CISC故事中了解的更多信息一样,这些信息从内存中提取指令。然后,通常按顺序执行每个指令。
一个最基本的CPU是一种设备,它具有许多称为寄存器的命名存储单元和许多称为算术逻辑单元(ALU)的计算单元。 ALU执行加法,减法和其他基本数学运算之类的操作。但是,这些仅连接到CPU寄存器。如果要相加两个数字,则必须从内存中获得这两个数字并放入CPU的两个寄存器中。
这是M1上的RISC CPU执行的一些典型指令示例。
这里的r1和r2是我所讨论的寄存器。现代RISC CPU无法对不在寄存器中的数字进行这样的操作。例如。它不能在两个不同位置的RAM中添加两个数字。相反,它必须将这两个数字放入单独的寄存器中。这就是我们在此简单示例中所做的。我们在RAM中的存储器位置150提取数字,并将其放入CPU的寄存器r1中。接下来,我们将地址200的内容放入寄存器r1中。只有这样,数字才可以用add r1,r2指令相加。
寄存器的概念是古老的。例如。在这个旧的机械计算器上,寄存器是保存您要添加的数字的函数。收银机一词的起源。寄存器是您注册输入数字的地方。
M1不是CPU,它是将多个芯片放入一个大的硅封装中的整个系统。 CPU只是这些芯片之一。
M1基本上是一台完整的计算机集成到芯片上。 M1包含CPU,图形处理单元(GPU),内存,输入和输出控制器以及构成一台整体计算机的许多其他功能。这就是我们所说的片上系统(SoC)。
今天,如果您从Intel或AMD购买芯片,实际上可以在一个封装中获得相当于多个微处理器的数量。过去,计算机的主板上会在物理上具有多个单独的芯片。
但是,由于今天我们能够在硅芯片上放置如此多的晶体管,因此英特尔和AMD等公司开始将多个微处理器集成到一个芯片上。今天,我们将这些芯片称为CPU内核。一个核心基本上是一个完全独立的芯片,可以从内存中读取指令并执行计算。
长期以来,就提高性能而言,这一直是游戏的名称:只需添加更多通用CPU内核即可。但是部队受到了干扰。 CPU市场中有一个参与者偏离了这一趋势。
苹果没有添加更多的通用CPU内核,而是采取了另一种策略:他们开始添加更多的专用芯片来完成一些特殊的任务。这样做的好处是,专用芯片趋于使用比通用CPU内核少得多的电流来显着更快地执行其任务。
这不是全新的知识。多年来,已经在Nvidia和AMD图形卡中安装了诸如图形处理单元(GPU)之类的专用芯片,它们执行与图形相关的操作要比通用CPU快得多。
苹果公司所做的只是简单地朝这个方向做出更根本的转变。 M1不仅具有通用内核和存储器,还包含各种各样的专用芯片:
中央处理器(CPU)-SoC的“大脑”。运行操作系统和应用程序的大多数代码。
图形处理单元(GPU)-处理与图形相关的任务,例如可视化应用程序的用户界面和2D / 3D游戏。
图像处理单元(ISP)-可用于加快图像处理应用程序完成的常见任务。
数字信号处理器(DSP)-处理比CPU更复杂的数学功能。包括解压缩音乐文件。
神经处理单元(NPU)—用于高端智能手机,以加速机器学习(AI)任务。这些包括语音识别和相机处理。
这就是为什么许多使用M1 Mac进行图像和视频编辑的人看到这种速度提高的原因之一。他们执行的许多任务可以直接在专用硬件上运行。这样一来,廉价的M1 Mac Mini就能编码大型视频文件,而又不会汗流while背,而昂贵的iMac却让所有粉丝全力以赴,但仍无法跟上潮流。
统一内存可能会使您感到困惑。与共享内存有何不同?过去,将视频内存与主内存共享不是一个糟糕的主意,导致性能降低吗?是的,共享内存确实不好。原因是CPU和GPU必须轮流访问内存。共享意味着要争用数据总线。基本上,GPU和CPU必须轮流使用狭窄的管道来推动或拉动数据。
统一内存不是这种情况。在统一内存中,GPU内核和CPU内核可以同时访问内存。因此,在这种情况下,共享内存没有开销。另外,CPU和GPU可以相互告知一些内存的位置。以前,CPU必须将数据从其主内存区域复制到GPU使用的区域。使用统一的内存,它更像是说“嘿,GPU先生,我从内存位置2430开始获得30 MB的多边形数据。”然后,GPU可以开始使用该内存,而无需进行任何复制。
这意味着,M1上的所有各种特殊协处理器都可以使用同一内存池彼此快速交换信息,因此可以显着提高性能。
如果苹果公司正在做的事情如此聪明,为什么不是每个人都这样做呢?在某种程度上,它们是。其他ARM芯片制造商越来越多地投入专用硬件。
AMD还开始在其某些芯片上安装功能更强大的GPU,并逐步采用加速处理单元(APU)向某种形式的SoC迈进,这些处理器基本上是CPU内核和GPU内核位于同一硅芯片上。
然而,有重要的原因使他们无法做到这一点。 SoC本质上是Dell和HP等计算机制造商生产的产品,因为SoC本质上是芯片上的整个计算机。这对于ARM来说效果很好,因为诸如Dell或HP之类的公司将简单地许可ARM知识产权,并可能从ARM购买其他芯片的各种IP,以添加他们认为自己的SoC应该具有的任何专用硬件。然后,他们将规格发送给GlobalFoundries或TSMC等半导体代工厂,后者今天为AMD和Apple生产芯片。
在这里,我们遇到了Intel和AMD业务模型的大问题。他们的商业模式基于销售通用CPU,而人们只是将其插入大型PC主板中。因此,计算机制造商只需从不同的供应商那里购买主板,内存,CPU和图形卡,然后将它们集成到一个解决方案中即可。
但是我们正在迅速远离那个世界。在新的SoC世界中,您无需组装来自不同供应商的物理组件。相反,您需要组装来自不同供应商的IP(知识产权)。您从不同的供应商那里购买了图形卡,CPU,调制解调器,IO控制器和其他产品的设计,并将其用于内部设计SoC。然后,您将得到一个铸造厂来制造它。
现在您遇到了一个大问题,因为英特尔,AMD或Nvidia都不会将其知识产权许可给戴尔或惠普,让他们为自己的机器制造SoC。
当然,英特尔和AMD可能只是开始销售完整的SoC。但是这些包含什么? PC制造商可能对它们包含的内容有不同的想法。英特尔,AMD,微软和PC制造商之间可能会出现关于应包含哪种专用芯片的冲突,因为这些芯片需要软件支持。
对于苹果公司来说,这很简单。他们控制整个小部件。他们给你例如核心ML库,供开发人员编写机器学习内容。 Core ML是在Apple的CPU上运行还是在Neural Engine上运行,是开发人员无需关心的实现细节。
因此,异构计算是原因的一部分,而不是唯一的原因。 M1上称为Firestorm的快速通用CPU内核确实非常快。与过去的ARM CPU内核相比,这是一个重大偏差,与AMD和Intel内核相比,ARM CPU内核通常非常弱。
相比之下,Firestorm击败了大多数Intel内核,几乎击败了最快的AMD Ryzen内核。传统观点认为这不会发生。
在讨论使Firestorm快速运行的原因之前,先要了解使快速CPU成为核心思想的真正意义。
上世纪80年代,这很容易。只要增加时钟频率,指令就会更快地完成。每个时钟周期都是计算机执行某项操作的时间。但是,这可能很少。因此,一条指令可能由多个较小的任务组成,因此可能需要多个时钟周期才能完成操作。
但是,如今几乎不可能提高时钟频率。这就是人们十多年来一直在努力的整个“摩尔定律的终结”。
有两种方法。一种是添加更多的CPU内核。从软件开发人员的角度来看,这就像添加线程。每个CPU内核都像一个硬件线程。如果您不知道线程是什么,则可以将其视为执行任务的过程。一个CPU具有两个内核,可以同时执行两个单独的任务:两个线程。这些任务可以描述为两个单独的程序存储在内存中,或者实际上可以是同一程序执行两次。每个线程都需要进行一些记账,例如该线程当前在程序指令序列中的位置。每个线程可以存储临时结果,应将其分开保存。
原则上,处理器只能具有一个内核并运行多个线程。在这种情况下,它只是暂停一个线程并存储当前进程,然后再切换到另一线程。稍后它将切换回去。这不会带来太多的性能提升,仅在线程可能经常停止等待用户输入,网络连接速度慢等数据时使用。这些可以称为软件线程。硬件线程意味着您可以使用实际的额外物理硬件(例如额外的内核)来加快处理速度。
问题在于,开发人员必须编写代码才能利用这一点。这样的一些任务(例如服务器软件)很容易编写。您可以想象分别处理每个连接用户。这些任务彼此独立,以至于拥有大量内核是服务器(尤其是基于云的服务)的绝佳选择。
这就是为什么您会看到诸如Ampere之类的ARM CPU制造商生产诸如具有疯狂的128核的Altra Max之类的CPU的原因。该芯片是专门为云计算的。您不需要疯狂的单核性能,因为在云中,每瓦特具有尽可能多的线程来处理尽可能多的并发用户。
相比之下,苹果则处于另一端。苹果生产单用户设备。大量线程不是优势。他们的设备用于游戏,视频编辑,开发等。他们希望台式机具有精美的响应图形和动画。
桌面软件通常不会利用很多内核。例如。电脑游戏可能会受益于8核,但是像128核这样的东西将完全浪费。相反,您将需要更少但更强大的内核。
因此,这很有趣,乱序执行是一种并行执行更多指令但不将该功能作为多个线程公开的方式。开发人员无需专门编码其软件即可利用它。从开发人员的角度来看,似乎每个内核的运行速度都更快。
要了解其工作原理,您需要了解一些有关内存的知识。在一个特定的内存位置中请求数据很慢。但是与说128个字节相比,延迟获得1个字节没有什么区别。数据通过我们所谓的数据总线发送。您可以将其视为内存与数据被推送通过的CPU不同部分之间的一条通道或管道。实际上,当然只有一些铜轨可以导电。如果数据总线足够宽,则可以同时获取多个字节。
因此,CPU一次执行一整条指令。但是它们被编写为一个接一个地执行。现代微处理器执行我们所谓的无序(OoO)执行。
这意味着他们能够快速分析指令缓冲区,并查看哪些指令取决于哪个指令。看下面的简单例子:
01:mul r1,r2,r3 // r1←r2×r3 02:加r4,r1,5 // r4←r1 + 5 03:加r6,r2,1 // r6←r2 + 1
乘法往往是一个缓慢的过程。可以这么说,它需要多个时钟周期来执行。第二条指令仅需等待,因为其计算取决于知道放入r1寄存器的结果。
但是,第03行的第三条指令并不取决于先前指令的计算结果。因此,乱序处理器可以开始并行计算此指令。
但实际上,我们正在谈论数百条指令。 CPU能够找出这些指令之间的所有依赖关系。
它通过查看每个指令的输入来分析指令。输入是否取决于一个或多个其他指令的输出?输入和输出是指包含以前计算结果的寄存器。
例如。加法r4,r1、5指令取决于mul r1,r2,r3产生的来自r1的输入。我们可以将这些关系链接在一起,成为CPU可以处理的详细图形。节点是指令,边是连接它们的寄存器。
CPU可以分析这样的节点图,并确定它可以并行执行哪些指令,以及在继续执行之前需要在哪里等待多个相关计算的结果。
许多说明会尽早完成,但我们无法将其结果正式化。我们无法提交它们,否则我们将以错误的顺序提供结果。在世界其他地方,必须仿佛按照说明的发布顺序执行说明。
像堆栈一样,CPU将从顶部一直弹出完成的指令,直到命中未完成的指令。
我们对这个解释还不够,但这给了您一些线索。基本上,您可以具有程序员必须知道的并行性,或者CPU伪造的类型看起来像一切都是单线程。但是在幕后,它正在执行乱序黑魔法。
出色的乱序执行功能使M1踢屁股上的Firestorm核心发挥了重要作用。实际上,它比Intel或AMD的任何产品都要强大。可能比主流市场上的任何其他产品都要强大。
在我对无序执行(OoO)的解释中,我跳过了一些重要的细节,需要覆盖这些细节。否则,无法理解为什么苹果领先于游戏,而英特尔和AMD可能无法追赶。
我所说的大“便签本”实际上称为“重排序缓冲区(ROB)”,它不包含正常的机器代码指令。不是CPU从内存中获取要执行的内容。这些是CPU指令集体系结构(ISA)中的指令。这就是我们称为x86,ARM,PowerPC等的指令。
但是,在内部,CPU会使用程序员无法看到的完全不同的指令集。我们称这些微操作(微操作或微操作)。 ROB充满了这些微型操作。
对于CPU可以并行运行的所有魔术,使用这些实用得多。原因是微操作非常广泛(包含很多位),并且可以包含各种元信息。您不能像这样将此类信息添加到ARM或x86指令中:
公开有关CPU工作方式的详细信息,无论它是否具有OoO单元,是否具有寄存器重命名以及许多其他详细信息。
许多元信息仅在当前执行情况下才有意义。
您可以将其视为编写程序时。您有一个公共API,需要保持稳定并供所有人使用。那就是ARM,x86,PowerPC,MIPS等指令集。微型操作基本上是用于实现公共API的专用API。
通常,微操作通常更容易用于CPU。为什么?因为他们每个人都完成一项简单的有限任务。常规的ISA指令可能更复杂,从而导致大量事情发生,从而实际上转化为多个微操作。
对于CISC CPU,通常只有使用微操作,否则别无选择,否则大型复杂的CISC指令会使流水线和OoO几乎无法实现。
RISC CPU可以选择。所以较小的ARM CPU根本不使用微操作。但这也意味着他们无法做诸如OoO之类的事情。
但是您想知道为什么这有什么关系吗?为什么要了解为什么Apple在AMD和Intel上占上风呢?
这是因为快速运行的能力取决于您可以用微操作填充ROB的速度以及有多少操作。您填写得越快,它就越大,您就有更多机会选择可以并行执行的指令,从而提高性能。
机器代码指令被我们称为指令解码器的指令切成微指令。如果我们有更多的解码器,我们可以并行切分更多的指令,从而更快地填充ROB。
这就是我们看到巨大差异的地方。最糟糕的英特尔和AMD微处理器内核具有4个解码器,这意味着它们可以并行解码4条指令,从而吐出微指令。
但是苹果公司有疯狂的8个解码器。不仅如此,ROB大约大3倍。您基本上可以容纳3倍的指令。没有其他主流芯片制造商的CPU拥有如此多的解码器。
这是我们最终看到RISC报仇的地方,也是M1 Firestorm内核具有ARM R的事实
......