接下来就澄清一下苹果的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的逆向工程,以发现该协处理器。这里
网页链接 描述了他所作的努力。对于与矩阵有关的数学运算,Apple具有特殊的库或框架,例如Accelerate,其组成如下:
vImage-更高级别的图像处理,例如格式之间的转换,图像处理。
BLAS —一种线性代数的行业标准(我们称其为处理矩阵和向量的数学方法)。
BNNS —用于运行神经网络和训练。
vDSP — 数字信号处理。傅立叶变换,卷积。这些是在图像处理或真正包括音频的任何信号中很重要的数学运算。
LAPACK -更高的水平线性代数函数,例如,用于求解线性方程组。 |