苹果M1使用了Arm自定义指令集?开发者逆向惊奇发现:​苹果M1未公开的秘密--矩阵协处理器

2021-01-18 09:26:35 来源:EETOP
近期,国外开发者Dougall Johnson通过逆向工程,在苹果M1处理器内发现了一个被称为AMX的强大的未公开过的秘密协处理器--矩阵协处理器


 
要弄清Apple矩阵协处理器具体是做什么的,需要弄清楚几个基本知识,例如什么是协处理器?什么是矩阵?为什么还要关心这些?
更重要的是,为什么苹果公司的幻灯片都没有提到这个协处理器?为什么它似乎是一个秘密?如果你已经了解了M1片上系统(SoC)中的神经引擎,您可能会对Apple的矩阵协处理器(AMX)与众不同的原因感到困惑。
在阐述这个大问题之前,我先说说基本概念,比如什么是矩阵?什么是协处理器
矩阵基本上只是一个数字表。如果您使用过Microsoft Excel等电子表格,则基本上可以使用与矩阵非常相似的东西。关键的区别在于,在数学中,这样的数字表有一个它们支持的操作列表和特定的行为。正如您在这里看到的,矩阵可以有不同的风格。有这样一行的矩阵,通常称为行向量。如果一个是列向量,我们称之为列向量。关于矩阵相关内容,相信每一个理工科专业的都应该非常了解,因此在此也不做过多的赘述了。
矩阵之所以重要,是因为它们在以下方面被广泛应用:
  • 图像处理

  • 机器学习

  • 语音和手写识别

  •  人脸识别

  • 压缩

  • 多媒体:音频和视频

尤其是这几年很火的机器学习。仅仅在CPU上增加更多的核心并不能让这个运行速度足够快,因为它的要求真的很高,这需要专门的硬件。常规任务如浏览互联网、写邮件、文字处理和电子表格已经运行了多年,速度已经足够快。而机器学习,这是我们真正需要提高处理能力的特殊任务。本文由EETOP编译整理
在任何给定的芯片上,苹果公司都有一个最大的晶体管数量来构建不同类型的硬件。他们可以增加更多的CPU核心,但这实际上只是加快常规任务的速度,而常规任务的运行速度已经足够快。因此,他们选择花晶体管来制造专门的硬件来解决图像处理、视频解码和机器学习。这个专用硬件就是协处理器和加速器。
如果你了解一些关于神经引擎的知识,你将会知道它还会执行矩阵运算以帮助完成机器学习任务。那么我们为什么需要矩阵协处理器呢?还是说它们其实只是同一种东西?这里大家是不是被搞糊涂了?
接下来就澄清一下苹果的Matrix协处理器和神经引擎有什么不同,以及为什么在M1处理器中这两者都需要。
处理器CPU)、协处理器和加速器通常可以通过共享数据总线交换数据。CPU通常控制内存访问,而加速器(例如GPU)通常具有自己的专用内存。
Nvidia图形卡中的GPU和神经引擎都是加速器的一种。
在这两种情况下,都有特殊的内存区域,CPU必须填充要处理的数据,而内存的另一部分则填充加速器应执行的指令列表。CPU设置此类处理非常耗时。需要进行大量协调,填写数据,然后等待获得结果。
因此,对应更大的任务来说,这个会带来回报,但是对于较小的任务,开销将太高。
与加速器不同,协处理器监视从内存读取到主处理器的指令流。相比之下,加速器不会遵守CPU从内存中提取的指令。
这就是协处理器优于加速器的地方。协处理器会监视从内存(更具体地说,是缓存)输入CPU的机器代码指令流。协处理器是用来对特定指令作出反应的。与此同时,CPU通常会忽略这些指令,或者帮助协处理器处理这些指令。
我们从中得到的好处是,协处理器执行的指令可以放在你的常规代码中。这与GPU不同。如果你做过GPU编程,则知道着色器程序已放置在单独的内存缓冲区中,并且你必须将这些着色器程序显式传输到GPU。你不能将GPU特定的指令放在常规代码中。因此,对于涉及矩阵处理的较小工作量,AMX将比神经引擎更加有效。
这样你需要在你的微处理器的指令集架构(ISA)中实际定义新的特定的指令。因此,与使用加速器相比,使用协处理器时需要与CPU紧密集成。
对于ARM指令集体系结构(ISA)的创建者ARM公司来说,长期以来一直拒绝向其ISA添加自定义指令。而可扩展自有指令,这个是RISC-V的优点之一。

但是,由于客户的压力,ARM在2019年10月做出了让步并宣布将允许扩展。参考:Arm推出自定义指令集功能

这可能有助于解释为什么官方文档中没有描述AMX指令。ARM期望Apple将此类指令保存在客户提供的库中。
很容易将矩阵协处理器与SIMD向量引擎混淆,目前大多数现代处理器(包括ARM处理器)内都有SIMD向量引擎。SIMD是单指令多数据的缩写。

单指令单数据(SISD)与单指令多数据(SIMD)

当你需要对多个元素执行相同的操作时,SIMD是一种获得更高性能的方法。这与矩阵运算密切相关。实际上,SIMD指令(例如ARM的Neon指令或Intel x86SSE或AVX)通常用于加速矩阵乘法。
然而SIMD向量引擎是微处理器内核的一部分。就像ALU(算术逻辑单元)和FPU(浮点单元)是CPU的一部分。在微处理器内部有一个指令解码器,它将对一条指令进行拆分,并决定激活什么功能单元。
CPU内部,会有ALU、FPU以及SIMD向量引擎,作为独立的部分,由指令解码器激活。而协处理器则是外置在微处理器内核上的。比如英特尔8087,这是最早的协处理器芯片之一,它是一种物理上独立的芯片,旨在加快浮点计算的速度。
对于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的逆向工程,以发现该协处理器。这里
https://gist.github.com/dougallj/7a75a3be1ec69ca550e7c36dc75e0d6f
描述了他所作的努力。对于与矩阵有关的数学运算,Apple具有特殊的库或框架,例如Accelerate,其组成如下:
  • vImage-更高级别的图像处理,例如格式之间的转换,图像处理。

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

  • BNNS —用于运行神经网络和训练。

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

  • LAPACK -更高的水平线性代数函数,例如,用于求解线性方程组。

Dougall Johnson知道这些库将使用AMX协处理器来加快计算速度。因此,他编写了一些特殊程序来分析和观察这些程序做了什么,以发现未记录的特殊AMX机器代码指令。
但为什么苹果公司不记录下来,让我们直接使用这些指令呢?如前所述,这是ARM公司希望避免的事情。如果自定义指令被广泛使用,可能会使ARM生态系统碎片化。
然而更重要的是,这对苹果来说是一个优势。通过仅允许他们的库使用这些特殊指令,苹果保留了以后从根本上改变这个硬件工作方式的自由。他们可以删除或添加AMX指令。或者他们可以让神经引擎来完成这项工作。无论哪种方式,他们都会让开发者的工作变得更容易。开发者只需要使用Accelerate框架,就可以忽略苹果如何专门加快矩阵计算的速度。
这是苹果通过垂直整合获得的最大优势之一。通过控制硬件和软件,他们可以利用这些技巧。那么下一个问题是这有多大的意义?就性能和功能而言,这对苹果有什么好处?
NodLabs是一家从事机器交互,智能和感知的公司。快速矩阵运算自然是他们的兴趣所在。他们写了一篇有关AMX性能测试的技术性很强的博客文章:比较Apple的M1 matmul性能-AMX2 vs NEON。https://nod.ai/comparing-apple-m1-with-amx2-m1-with-neon/
他们要做的是比较用AMX做类似代码的性能和用ARM官方支持的Neon指令做的性能。Neon是SIMD指令的一种。
Nod实验室发现,通过使用AMX,他们能够获得Neon指令两倍的矩阵运算性能。这并不意味着AMX对所有事情都更好,但至少对于机器学习和高性能计算(HPC)类型的工作,我们可以期待AMX给竞争者带来优势。
苹果矩阵协处理器看起来是一些相当令人印象深刻的硬件,让苹果的ARM处理器在机器学习和HPC相关的工作中占据优势。
推荐阅读:
 

点击阅读原文预约报名

  1. EETOP 官方微信

  2. 创芯大讲堂 在线教育

  3. 创芯老字号 半导体快讯

相关文章

全部评论

  • 最新资讯
  • 最热资讯
X