当前位置:数码通 > 软件

为什么苹果的M1芯片这么快?

来源于 数码通 2023-10-05 04:17

除了轻型办公之外,基于Arm的苹果电脑还可以玩游戏、观看视频、运行深度学习,一切都具有高效率。好的。

最近,很多人的M1芯片版本的Apple MacBook和Mac Mini已经到货了。在很多测试中,我们都看到了可喜的结果:M1芯片性能堪比高端Core i9也能与NVIDIAGPUGTX 1050Ti竞争。 5nm芯片真的有那么神奇吗?

自从苹果发布搭载自研M1芯片的Mac产品以来,人们对M1芯片就充满了好奇,各种评论也纷至沓来。近日,开发者 Erik Engheim写了一篇长文,分析了M1芯片高速背后的技术原因,以及Intel、AMD等芯片厂商的劣势。关于Apple的M1芯片,本文将讨论以下问题:

M1 芯片速度背后的技术原因。

苹果是否使用了任何特殊技术来实现这一目标?

如果Intel和AMD也想这样做,会有多困难?

由于苹果官方宣传中有很多技术术语,所以我们先从基础开始。什么是CPU?当谈到 Intel 和 AMD 的芯片时,我们通常谈论的是中央处理器 (CPU),或微处理器。它们从内存中获取指令并按顺序执行每条指令。

基本的 RISC CPU(不是 M1)。指令沿着蓝色箭头从内存移动到指令寄存器。译码器用于解释指令的内容,并通过红色控制线连接CPU的各个部分。 ALU 对寄存器中的数字进行加法和减法。CPU 本质上是一种设备,包含许多称为寄存器的存储单元和称为算术逻辑单元 (ALU) 的计算单元。 ALU 执行加法、减法和其他基本数学运算。然而,这些仅连接到 CPU 寄存器。如果你想将两个数字相加,你必须将这两个数字从内存中取出,并将它们放入CPU上的两个寄存器中。以下是 RISC CPU(M1 中的 CPU 类型)执行的典型指令的几个示例:

这里r1和r2是寄存器。当前的 RISC CPU 无法对不在寄存器中的数字执行示例中的操作。例如,您不能将内存中两个不同位置的数字相加。相反,您需要将这两个数字放入单独的寄存器中。在上面的例子中,我们必须首先将内存位置150处的数字放入寄存器r1中,然后将位置200处的数字放入r2中。然后两个数才能根据add r1,r2指令进行加法运算。

这个旧的机械计算器有两个寄存器:累加器和输入寄存器。现代 CPU 通常有十几个寄存器,它们是电子,而不是机械的。寄存器的概念已经存在很长时间了。例如,在上图所示的机械计算器上,寄存器用于存储相加的数字。 M1并不像CPU那么简单。 M1芯片不是CPU,而是集成在一起的多个芯片,CPU只是其中的一部分。可以说,M1将整个计算机放在了一颗芯片上。 M1包含了CPU、GPU、内存、输入/输出控制器以及完整计算机所需的许多其他东西,也就是我们经常在手机上看到的SoC(片上) 系统)概念。

M1是一个片上系统。换句话说,构成计算机的所有组件都放置在硅芯片上。如今,如果您购买英特尔或 AMD 的芯片,您实际上获得的是微处理器套件,而不是过去计算机主板上的多个单独芯片。

以计算机主板为例,其中包含内存、CPU、显卡、IO 控制器、网卡等部件。然而,现在我们可以将许多晶体管封装到一块硅上,因此AMD、Intel等公司开始在单个芯片上放置多个微处理器。我们将这些芯片称为 CPU 核心。核心基本上是一个完全独立的芯片,它从内存中读取指令并执行计算。

具有多个 CPU 内核的微芯片。长期以来,添加更多通用CPU核心一直是提高芯片性能的主要途径,但有一家制造商没有这样做。苹果的异构计算策略并不那么神秘。在提升性能的道路上,苹果并没有选择添加更多的通用CPU核心,而是采取了另一种策略:添加更多专用芯片来完成一些专门的任务。这样做的好处是,专用芯片比通用 CPU 核心可以使用更少的电流来执行任务,而且速度也更快。这并不是一项全新的技术。图形处理单元 (GPU) 等专用芯片多年来一直存在于 Nvidia 和 AMD 的显卡中,执行图形相关操作的速度比通用 CPU 快得多。苹果只是在这个方向上走得更彻底。除了通用内核和内存之外,M1 还包含一系列专用芯片:

CPU(中央处理单元):SoC 的“大脑”,运行操作系统和大部分应用程序代码。

GPU(图形处理单元):处理与图形相关的任务,例如可视化应用程序的用户界面和 2D/3D 游戏。

IPU(图像处理单元):用于加速图像处理应用程序执行的常见任务。

DSP数字信号处理器):具有比 CPU 更多的数学密集型功能,包括解压缩音乐文件。

NPU(神经网络处理器):用于高端智能手机,以加速机器学习任务,例如语音识别。

视频编码器/解码器:以节能的方式处理视频文件和格式的转换。

Secure Enclave:负责加密、身份验证和维护安全。

统一内存(统一memy):允许CPU、GPU和其他核心快速交换信息

这就是为什么使用 M1 Mac 进行图像和视频编辑速度如此之快的部分原因。其中许多任务可以直接在专门的硬件上运行,从而使相对便宜的M1 Mac Mini能够轻松编码大型视频文件。

您可能想知道,统一内存和共享内存有什么区别。与主内存共享视频内存会导致性能不佳,因为 CPU 和 GPU 必须轮流访问内存,而共享意味着数据总线的争用。统一内存的情况就不同了。在统一内存中,CPU和GPU可以同时访问内存,并且CPU和GPU还可以互相告诉对方某些内存的位置。以前CPU必须将数据从其主存区域复制到GPU使用的区域,但是在统一内存模式下,不需要复制,并且可以通过告诉GPU在哪里来告诉GPU使用该内存。也就是说,M1上的各个专有协处理器都可以使用相同的内存池来快速相互交换信息,从而显着提高性能。为什么Intel和AMD不遵循这个策略呢?其他 ARM 芯片制造商也越来越多地投资于专用硬件。 AMD 开始在其部分芯片上配备更强大的 GPU,并通过加速处理单元 (APU) 逐渐转向某种形式的 SoC。 (APU 将 CPU 核心和 GPU 核心放置在同一芯片上。)

AMD Ryzen 加速处理器将 CPU 和 GPU 组合在同一芯片上,但不包括额外的协处理器、IO 控制器或统一内存。英特尔和AMD不这样做有重要原因。 SoC 本质上是一个芯片上的完整计算机,这使其非常适合 HP、Dell 等实际计算机制造商。计算机制造商可以简单地获得 ARM 的知识产权许可,并从其他芯片购买 IP,以添加他们认为 SoC 应该具备的任何专用硬件。然后,他们将完成的设计交给 半导体 代工厂,例如 GlobalFoundries 和台积电 (TSMC),后者现在是 AMD 和 Apple 的芯片代工厂。

那么问题来了。英特尔和 AMD 的商业模式都是基于销售可简单插入大型 PC 主板的通用 CPU。计算机制造商只需从不同的供应商那里购买主板、内存、CPU 和显卡,然后进行集成即可。但这种做法已经逐渐淡出。在SoC时代,计算机制造商不再组装来自不同供应商的物理组件,而是组装来自不同供应商的IP(知识产权)。他们从不同的供应商那里购买显卡、CPU、调制解调器、IO 控制器等的设计,并用它们来设计 SoC,然后找到代工厂来完成制造过程。但英特尔、AMD 和 Nvidia 都不会将自己的知识产权交给戴尔或惠普来为其计算机制造 SoC。

当然,英特尔和 AMD 可能刚刚开始销售完整的 SoC,但其中包含什么? PC制造商对此可能有不同的想法。英特尔、AMD、微软和 PC 制造商之间可能会在 SoC 中包含哪些专用芯片方面存在冲突,因为这些芯片需要软件支持。对于苹果来说,这很容易。苹果控制着整个产品,例如为机器学习开发人员提供的 Core ML 库。至于Core ML是运行在Apple的CPU上还是Neural Engine上,这是开发者不需要担心的实现细节。 CPU 快速运行的根本挑战异构计算只是故事的一部分。 M1的快速通用CPU核心Firestorm确实非常快,与之前的ARM CPU核心相比,两者之间的速度差距巨大。与AMD和Intel内核相比,ARM也非常弱。相比之下,Firestorm 击败了大多数 Intel 核心,并几乎击败了最快的 AMD Ryzen 核心。在我们探讨 Firestorm 如此快的原因之前,让我们先了解 CPU 如此快的核心原因。原则上,CPU加速的任务可以通过以下两种策略来完成:

顺序执行更多指令且速度更快;

并行执行大量指令。

在 20 世纪 80 年代,这很容易做到。只要提高时钟频率,指令就能执行得更快。每个时钟周期代表计算机执行某些任务所需的时间,但是该任务可能非常分钟。一条指令由多个较小的任务组成,因此可能需要多个时钟周期。但现在想要提高时钟频率几乎是不可能的,因此第二种策略“并行执行大量指令”是当前研发的重点。多核或乱序处理器?这个问题有两种解决方案。一是引入更多的CPU核心。从软件开发人员的角度来看,这类似于添加线程,每个 CPU 核心都充当硬件线程。双核 CPU 可以同时执行两个单独的任务或两个线程。这些任务可以描述为存储在内存中的两个单独的程序,或者同一程序被执行两次。每个线程都需要一个记录,例如线程在程序指令序列中的当前位置。每个线程可以存储临时结果(应单独存储)。

原则上,处理器可以仅用一个内核运行多个线程。此时处理器只能暂停一个线程并存储当前进程,然后切换到另一个线程,然后再次切换回来。这不会带来太大的性能增益,并且仅在线程不断悬停等待用户输入或慢速网络等中的数据时使用。这些可以称为软件线程。硬件线程意味着可以使用实际的附加物理硬件(例如附加内核)来加速处理。

问题是开发人员必须编写代码才能利用这一点,某些任务(例如服务器软件)很容易编写,您可以想象用户单独处理每个连接。这些任务是相互独立的,因此拥有大量核心对于服务器,尤其是基于云的服务来说是一个不错的选择。

128 核 Ampere Altra Max ARM CPU 专为云计算而设计,其中大量硬件线程是一个优势。这就是为什么您会看到 128 核 Ampere Altra Max ARM CPU。该芯片是为云计算而构建的,云计算不需要疯狂的单核性能,在云计算中,您需要每瓦尽可能多的线程来处理尽可能多的并发用户。但苹果不同。苹果生产单用户设备,大量线程并不是优势。苹果设备主要用于游戏、视频编辑、开发等。苹果希望台式机具有漂亮的响应式图形和动画。桌面软件通常不需要使用很多核心,例如PC游戏通常需要8个核心,那么128个核心就完全是浪费。因此,用户需要更少但更强大的内核。

乱序执行是一种并行执行更多指令的方式,但不是在多线程中执行。开发人员无需专门编写软件代码即可利用它。从开发人员的角度来看,每个核心运行速度更快。要了解它的工作原理,首先我们需要了解一些内存知识。在特定内存位置请求数据的速度很慢。但延迟获取 1 个字节的影响比获取 128 个字节的影响要小。数据通过数据总线发送,您可以将其视为内存与数据所经过的 CPU 不同部分之间的通道或管道。它实际上只是一些导电的铜线。如果数据总线足够宽,可以同时读取多个字节。因此,CPU 一次执行整个指令块,但这些指令被编程为一个接一个地执行。现代微处理器执行“乱序执行”。这意味着他们可以快速分析指令缓冲区以查看指令之间的依赖关系。示例如下:

01: mul r1, r2, r3 // r1 ← r2 × r302: add r4, r1, 5 // r4 ← r1 + 503: add r6, r2, 1 // r6 ← r2 + 1 乘法是一个缓慢的运算过程,需要多个时钟周期来执行。第二条指令只需要等待,因为它的计算取决于先知道放入 r1 寄存器的结果。然而,第三条指令不依赖于前一条指令的计算,因此乱序处理器可以并行计算该指令。但现实往往有数百条指令,CPU 可以弄清楚它们之间的所有依赖关系。

它通过查看指令的输入(包含先前计算结果的寄存器)来分析指令的输入是否依赖于一个或多个其他指令的输出。例如,在上面的例子中,add r4,r1,5指令依赖于r1的输入,而r1是通过mul r1,r2,r3指令获得的。我们可以将这些关系链接在一起,形成 CPU 可以处理的详细图表。图中的节点代表指令,边代表连接它们的寄存器。 CPU可以分析这样的节点图,并确定哪些指令可以并行执行,以及在哪些步骤需要等待多个相关计算的结果才能继续执行。

很多指令可以很早就完成,但结果却无法形式化。我们无法提交这些结果,否则订单将是错误的。指令通常需要按顺序执行。就像堆栈一样,CPU 会从顶部一直弹出已完成的指令,直到命中未完成的指令。乱序执行功能使得 M1 上的 Firestorm 核心非常有用,实际上它比 Intel 或 AMD 的产品更强大。为什么乱序执行在 Intel 和 AMD 上比在 M1 上更糟糕? “重排序缓冲区”(ROB)不包含常规机器代码指令,即CPU从内存获取要执行的指令。这些是CPU指令集架构(ISA)中的指令,我们称之为x86、ARM、PowerPC等。但是,CPU内部使用了程序员看不到的完全不同的指令集,即micro -ops(微操作或μops),ROB中充满了微操作。微操作非常广泛(包含许多位)并且可以包含各种元信息。ARM 或 x86 指令无法添加此信息,因为会发生什么:

该程序的二进制文件完全臃肿。

暴露CPU工作原理的细节,比如是否存在乱序执行单元、寄存器重命名等细节。

许多元信息仅在当前执行的上下文中才有意义。

你可以认为,在编写程序时,有一个通用的 API 需要保持稳定并可供每个人使用,那就是 ARM、x86、PowerPC、MIPS 等。指令系统。微操作基本上是用于实现公共 API 的私有 API。微操作通常更容易用于 CPU,因为每个微指令执行简单、有限的任务。常规 ISA 指令可能更复杂,并导致很多事情发生,这有效地转化为多个微操作。 CISC CPU通常只使用微操作,否则庞大而复杂的CISC指令将使流水线和乱序执行几乎无法实现。 RISC CPU 有一个选项,因此较小的 ARM CPU 不使用微操作,但这也意味着它们不能执行乱序执行等。这是理解 Intel 和 AMD 性能不佳的关键。与 M1 一样无序。

快速运行的能力取决于您可以用微操作填充 ROB 的速度和程度。填充速度越快,这种能力就越大,您就有更多机会选择可以并行执行的指令,从而进一步提高性能。机器码指令被指令译码器分成多个微操作。有了更多解码器,我们可以并行分割更多指令,从而更快地填充 ROB。这就是巨大差异的地方。最差的Intel和AMD微处理器核心有4个解码器,这意味着它可以并行解码4条指令并输出微操作。

但苹果有 8 个编解码器。不仅如此,ROB 大约大 2 倍,基本上可以容纳 3 倍的指令。没有其他主要芯片制造商的 CPU 拥有如此多的编解码器。为什么Intel和AMD不能添加更多的指令解码器?这就涉及到RISC了。 M1 Firestorm核心采用ARM RISC架构。对于 x86,指令的长度可以是 1-15 个字节。在 RISC 芯片上,指令大小是固定的。如果每条指令的长度相同,那么将字节流分割成指令并将它们输入 8 个不同的并行解码器就很简单了。但在 x86 CPU 上,解码器不知道下一条指令从哪里开始,它必须实际解析每条指令以确定其长度。

Intel 和 AMD 采取了一种强力方法来解决这个问题,尝试在每个可能的起点解码指令。这意味着必须处理很多糟糕的猜测和错误。这使得解码器阶段非常复杂并且难以添加更多解码器。相比之下,苹果可以轻松添加更多编解码器。事实上,添加更多的东西会导致许多其他问题,以至于 AMD 本身基本上已经达到了 4 个编解码器的极限。正是这一点使得 M1 Firestorm 核心在相同时钟频率下处理的指令数量是 AMD 和 Intel CPU 的两倍。有人可能会反驳说 CISC 指令会变成更多的微操作,它们更密集,因此解码一条 x86 指令类似于解码两条 ARM 指令。但实际上,高度优化的 x86 代码很少使用复杂的 CISC 指令。在某些方面,它是 RISC 式的。但这对 Intel 或 AMD 没有帮助,因为尽管 15 字节长的指令很少见,但必须构建解码器来处理它们。这造成了复杂性,阻碍了 AMD 和英特尔添加更多编解码器。 AMD的Zen3核心不是更快吗?据了解,最新AMD CPU核心(即Zen3)比Firestorm核心稍快。但这只是因为 Zen3 核心的时钟频率为 5 GHz,而 Firestorm 核心的时钟频率为 3.2 GHz。尽管 Zen3 的时钟频率高出近 60%,但还是勉强击败了 Firestorm。那么苹果为什么不提高时钟频率呢?因为更高的时钟频率会使芯片更热。这也是苹果的主要卖点之一。与英特尔和 AMD 的产品不同,他们的计算机几乎不需要冷却。本质上,我们可以说Firestorm核心确实比Zen3核心更好。 Zen3 只能通过消耗更多电流并变得更热来保持领先地位。苹果选择不这样做。

如果苹果想要更高的性能,他们只会添加更多的核心。这可以降低功耗,同时提供更高的性能。未来会怎样 看起来 AMD 和英特尔在两个方面陷入了困境:

他们没有可以让他们轻松追求异构计算和 SoC 设计的商业模式。

传统的x86 CISC指令集使得它们很难提高乱序执行性能。

但这并不意味着游戏结束了。它们当然可以提高时钟速度、使用更多冷却、添加更多核心、增强 CPU 缓存等。但它们目前处于劣势。 Intel的处境最为糟糕,因为它的核心已经被Firestorm击败,而且它的GPU很弱,无法集成到SoC方案中。引入更多内核的问题在于,对于典型的桌面工作负载,使用太多内核会导致收益递减。当然,许多内核非常适合服务器。但像 Amazon 和 Ampere 这样的公司已经在使用巨型 128 核 CPU。幸运的是,苹果并没有出售其芯片。因此,PC 用户只能满足于 AMD 和英特尔提供的产品。 PC 用户可能会跳槽,但这是一个缓慢的过程。人们一般不会立即离开一个已经有大量投资的平台。然而,年轻的专业人​​士并没有在任何平台上投入太多,他们未来可能会越来越多地转向苹果,从而扩大苹果在高端市场的份额。终端市场及其占个人电脑市场总利润的份额。参考内容:https://m.smtshopping.cn/why-is-apples-m1-chip-so-fast-3262b158cba2

原标题:为什么苹果的M1芯片这么快?

文章来源:【微信公众号:FPGA技术江湖】欢迎添加关注!转载文章时请注明出处。

责任编辑:haq

-->
登录后参与评论