苹果M1协处理器的秘密

2021-01-16 19:14:55

开发人员道格·约翰逊(Dougall Johnson)通过反向工程发现了一个秘密的,功能强大的协处理器,称为AMX:M1芯片内部的Apple Matrix协处理器。

关于Apple Matrix协处理器(AMX)的故事已经在那里。但是并没有以初学者友好的方式进行精确讨论。这就是我在这里尝试做的。将故事带给您隐藏在厚厚的专业术语下,而不会像对待白痴一样对待您。

为了讲这个故事,我们需要弄清基本知识,例如什么是协处理器?什么是矩阵?而且,您为什么还要关心这些?

更重要的是,为什么没有Apple幻灯片谈论此协处理器?为什么看似秘密?如果您已经了解了M1片上系统(SoC)中的神经引擎,那么您可能会对Apple的矩阵协处理器(AMX)与众不同的原因感到困惑。

在提出一个大问题之前,让我从基本概念开始,例如什么是矩阵和协处理器。

矩阵基本上只是一个数字表。如果您使用过Microsoft Excel等电子表格,则基本上可以使用与矩阵非常相似的东西。关键区别在于,在数学上,此类数字表具有其支持的特定操作和特定行为的清单。正如您在此处看到的,矩阵可以有不同的口味。具有这种行的矩阵通常称为行向量。如果一个列,我们称之为列向量。

我们可以添加,减去,缩放和多个矩阵。加法非常容易。您只需分别添加每个元素。乘法要复杂得多。我只是在这里显示一个简单的案例。

特别是最近几年一直很热门的机器学习。仅向CPU添加更多的内核并不能使它足够快地运行,因为这确实非常需要。您确实需要专用的硬件。多年来,浏览互联网,编写电子邮件,文字处理和电子表格等常规任务已经足够快地运行了。这是我们真正需要提高处理能力的特殊任务。

在任何给定的芯片上,Apple都有最多数量的晶体管用于构建不同种类的硬件。他们可以添加更多的CPU内核,但这实际上只是加快了已经足够快地运行的常规任务。因此,他们选择花费晶体管制造专门的硬件来处理图像处理,视频解码和机器学习。这种专用硬件是协处理器和加速器。

如果您已经阅读了有关神经引擎的信息,您将知道它还会执行矩阵运算以帮助完成机器学习任务。那么为什么我们需要矩阵协处理器呢?还是它们实际上是同一件事?我只是感到困惑吗?不,让我澄清一下苹果的矩阵协处理器与神经引擎有何不同,以及为什么我们需要两者。

我承认在过去的故事中,我经常互换使用术语协处理器和加速器,但是它们并不相同。 Nvidia图形卡中的GPU和神经引擎都是加速器的一种。

在这两种情况下,您都有特殊的内存区域,CPU必须填充要处理的数据,而内存的另一部分则填充加速器应执行的指令列表。 CPU设置此类处理非常耗时。需要进行大量协调,填写数据,然后等待获得结果。

因此,这只会为更大的任务带来回报。对于较小的任务,开销将太高。

这就是协处理器优于加速器的地方。协处理器坐在并监视从内存(或更具体地说,是缓存)馈送到CPU的机器代码指令流。使协处理器对它们要处理的特定指令作出反应。同时,已使CPU几乎忽略了这些指令或帮助协处理器处理它们。

我们从中得到的好处是,协处理器执行的指令可以放在常规代码中。这与GPU不同。如果您已完成GPU编程,则知道着色器程序已放置在单独的内存缓冲区中,并且您必须将这些着色器程序显式传输到GPU。您不能将GPU特定的指令放在常规代码中。因此,对于涉及矩阵处理的较小工作量,AMX将比神经引擎更好。

有什么收获?您实际上需要在微处理器的指令集体系结构(ISA)中定义指令。因此,与使用加速器相比,使用协处理器时需要与CPU紧密集成。

ARM指令集体系结构(ISA)的创建者ARM公司长期以来一直拒绝向其ISA添加自定义指令。这是RISC-V的优点之一:RISC-V的创新之处是什么?

但是,由于客户的压力,ARM在2019年做出了让步并宣布将允许扩展。 EE Times报告:

新指令与标准Arm指令交错。为了避免软件碎片化并保持一致的软件开发环境,Arm希望客户主要在称为库函数的地方使用自定义指令。

这可能有助于解释为什么官方文档中没有描述AMX指令。 ARM Ltd.期望Apple将此类指令保存在客户提供的库中(在这种情况下为Apple)。

将矩阵协处理器与SIMD向量引擎相混淆是很容易的,您可以在当今大多数现代处理器(包括ARM处理器)中找到它们。 SIMD代表单指令多数据。

当您需要对多个元素执行相同的操作时,SIMD是一种获得更高性能的方法。这与矩阵运算密切相关。实际上,SIMD指令(例如ARM的Neon指令或Intel x86 SSE或AVX)通常用于加速矩阵乘法。

但是,SIMD向量引擎是微处理器核心的一部分。就像ALU(算术逻辑单元)和FPU(浮点单元)一样,它也是CPU的一部分。在微处理器内部有一个指令解码器,它将分解一条指令并确定要激活的功能单元(灰色框)。

相反,协处理器位于微处理器内核的外部。实际上,英特尔8087是最早的芯片之一,它是一种物理上独立的芯片,旨在加快浮点计算的速度。

现在,您可能会奇怪,为什么有人会想通过拥有一个像这样的单独芯片来使CPU设计复杂化,该芯片必须嗅探从内存到CPU的数据流,以查看是否有任何浮点指令。

原因很简单,第一批PC中的原始8086 CPU包含29,000个晶体管。相反,8087在45,000个晶体管时要复杂得多。这么多晶体管真的很难制造任何东西。将这两种芯片合并为一个芯片确实非常困难且昂贵。

但是,随着制造技术的改进,将浮点单元(FPU)放入CPU并不是问题。因此,FPU取代了浮点协处理器。

对于我来说,为什么AMX不仅是M1上Firestorm核心的一部分还不清楚。无论如何,它们都在同一个硅芯片上。我只能提供一些推测。通过成为协处理器,CPU继续并行运行可能会更容易。苹果可能还喜欢将非标准的ARM产品保留在其ARM CPU内核之外。

如果官方文档中没有描述AMX,我们怎么知道呢?感谢开发人员Dougall Johnson,他出色地完成了M1的逆向工程,以发现该协处理器。这里描述了他的努力。对于与矩阵有关的数学运算,Apple具有特殊的库或框架,例如Accelerate,其组成如下:

BLAS —一种线性代数的行业标准(我们称其为处理矩阵和向量的数学方法)。

vDSP —数字信号处理。傅立叶变换,卷积。这些是在图像处理或真正包括音频的任何信号中很重要的数学运算。

Dougall Johnson知道这些库将使用AMX协处理器来加快计算速度。因此,他编写了一些特殊程序来分析和观察这些程序做了什么,以发现未记录的特殊AMX机器代码指令。

但是,Apple为什么不记录下来并让我们直接使用这些说明?如前所述,这是ARM Ltd.想要避免的事情。如果广泛使用自定义指令,则可能使ARM生态系统支离破碎。

但是,更重要的是,这对Apple来说是一个优势。通过仅允许其库使用这些特殊说明,Apple保留了从根本上改变此硬件以后工作方式的自由。他们可以删除或添加AMX指令。或者,他们可以让神经引擎来完成这项工作。无论哪种方式,它们都使开发人员的工作更加轻松。开发人员只需要使用Accelerate框架,就可以忽略Apple专门如何加快矩阵计算的速度。

这是苹果通过垂直整合获得的最大优势之一。通过控制硬件和软件,他们可以利用这些技巧。那么下一个问题是这有多大的意义?就性能和功能而言,这对苹果有什么好处?

Nod Labs是一家从事机器交互,智能和感知的公司。快速矩阵运算自然是他们的兴趣所在。他们撰写了一篇有关AMX性能测试的技术性很强的博客文章:比较Apple的M1 matmul性能-AMX2 vs NEON。

他们正在做的是比较使用AMX和使用Neon指令(由ARM正式支持)执行类似代码的性能。霓虹灯是一种SIMD指令。

Nod Labs发现的是,通过使用AMX,他们可以在矩阵运算中获得两倍于Neon指令的性能。这并不意味着AMX可以在所有方面都做得更好,但是至少对于机器学习和高性能计算(HPC)类型的工作而言,我们可以期望AMX在竞争中占据优势。

Apple Matrix协处理器看起来像一些相当令人印象深刻的硬件,这使Apple的ARM处理器在机器学习和HPC相关任务方面处于优势。进一步的调查将为我们提供更完整的信息,我可以更详细地更新此故事。