ARM MacBook与Intel MacBook:SIMD基准测试

2020-12-14 22:22:04

在我之前的博客文章中,我将基于ARM的新款MacBook Pro与基于Intel 2017的MacBook Pro的性能进行了比较。我使用了数字解析基准。在某些情况下,基于ARM的MacBook Pro的速度几乎是旧的基于Intel的MacBook Pro的两倍。

我认为Apple M1处理器是笔记本电脑行业的突破。它使苹果公司能够销售出第一款非常出色的基于ARM的笔记本电脑。当然,不仅仅是芯片。它周围的一切。例如,我完全希望大多数购买这些基于ARM的新型笔记本电脑的人永远不会意识到它们不是基于Intel的。过渡是如此顺利。

我很兴奋,因为我认为它将推动其他笔记本电脑制造商重新考虑他们的设计。您可以从Apple购买具有20小时电池寿命的薄型笔记本电脑,并且能够像更大更重的笔记本电脑那样进行密集的计算。

但是,我认为新的Apple处理器在所有方面都不比Intel处理器更好。一个明显的警告是,我正在将Apple M1(2020年处理器)与一个较旧的Intel处理器(2017年发布)进行比较。但是我认为,即使在某些任务上,即使是较旧的英特尔处理器也可以在Apple M1上占据优势,我想澄清这一点。我不认为这是有争议的。但是我因发表以下言论而受到批评:

在某些方面,Apple M1芯片远不如我的旧Intel处理器。英特尔处理器具有漂亮的256位SIMD指令。苹果芯片没有任何东西可以作为其主CPU的一部分。因此,我可以轻松地提出一些使M1看起来很糟糕的示例。

这使许多读者误入歧途。他们指出,ARM处理器确实具有称为NEON的128位SIMD指令。他们是这样。在某些方面,NEON指令集比x64 SSE / AVX更好。最近的Apple ARM处理器有四个执行SIMD处理的执行单元,而Intel处理器只有三个。此外,英特尔执行单元还有更多限制。因此,尽管64位ARM NEON例程都在128位寄存器上运行,但它们的性能将优于同类的SSE2(128位SIMD)Intel例程。实际上,我有一篇博客文章通过使用iPhone的处理器来说明这一点。

但是并不能因此得出结论,128位ARM NEON指令通常与Intel和AMD提供的256位SIMD指令相匹配。

让我们说明一下这个问题。 simdjson库提供重载SIMD的功能,以最小化JSON并验证UTF-8输入。我编写了一个基准程序,该程序将文件加载到内存中,然后反复调用minify和validate函数,以寻求最佳的速度。使用MacBook和Xcode的任何人都应该能够重现我的结果。

向量化的UTF-8验证算法在每字节少于一个指令的验证UTF-8中进行了描述(发布于软件:实践和经验)。

simdjson库依赖于抽象层,因此可以使用更高级别的C ++来实现功能,该C ++可以转换为特定于目标系统的高效SIMD内在函数。也就是说,我们没有比较不同的手动调整的汇编函数。您可以自己在线查看UTF-8验证代码。

如您所见,在这些特定测试中,较旧的Intel处理器远远优于Apple M1。

当然,这只是一组基准。有很多混杂因素。算法选择是否有利于AVX2 ISA?有可能的。值得庆幸的是,所有源代码均可用,因此可以评估任何此类偏见。

我相信对于某些SIMD密集型任务,使用Intel和AMD处理器将获得更好的结果。更高级和更宽的SIMD指令可能会具有寄存器宽度和执行单元无法体现的优势。

笔记。有些人读这样的博客文章太快了。因此,让我明确并重复一下:

我的2020 MacBook Pro为我的日常活动配备了更好的全能处理器。 实际上,这就是为什么我不想一开始就包含SIMD编号的原因,因为我认为出色的SIMD性能不能弥补较弱的总体性能。 我并不是说SIMD指令的性能完全取决于寄存器的宽度。 也就是说,我并不是说因为ARM NEON具有128位寄存器,而不是Intel的256位或512位,所以它将慢2倍或4倍。 指令宽度只是一个因素。 实际上,我已经写过一个事实,即苹果处理器上的ARM NEON可以比英特尔处理器上的同类128位SSE2更好。 (用于解码)和五个(用于编码)。 我知道Apple在带有神经引擎和GPU的系统上包括了ARM内核。