Apple M1 とそれまでの Apple CPU の比較など

久しぶりに Intel Mac を使うと、コンパイルがなかなか終わらなくてあれ?と思うことがあります。以前比べたときは、同じ 2020年モデル同士の比較ながらビルド時間で 5倍ほどの差がありました。

M1 Mac が速い理由は色々あると思いますが、そもそもシンプルに CPU が速いです。これまで直接比較できるプラットフォームが無かっただけで、Apple の CPU はシングルスレッド性能が高くパフォーマンスが良好でした。

2018年に A12X を搭載した第3世代 iPad Pro が登場した時点ですでに「ほとんどのノートパソコンよりも優れたパフォーマンス」(ノートパソコンの92パーセントよりも高速)と謳っていることからもわかります。

先日 Apple Watch Series 6 の Apple S6 について性能を測定しました。合わせて手持ちの他のデバイスも一通りチェックしたのでその結果をまとめてみます。ログの全体はこちらにあります。

浮動小数点演算の同時に実行できる命令数 (IPC) に注目したのが下記の表です。単精度と一部の CPU のみ抜き出しています。あくまで浮動小数点演算命令しか見ていないので、必ずしも全体の性能を見ているわけではない点にご注意ください。

float 32bit Scalar
CPU/SoC SIMD Width add mul fma total
Apple S1 32bit fma 1 1 1 1
Apple S2 32bit fma 1 1 1 1
Apple S6 128bit add + 128bit fma 2 1 1 2
Apple A5 128bit mad 1 1 1 1
Apple A6 128bit fma 1 1 1 1
Apple A7 128bit add + 128bit fma x2 3 2 2 3
Apple A8 128bit add + 128bit fma x2 3 2 2 3
Apple A9 128bit fma x3 3 3 3 3
Apple A10 128bit fma x3 3 3 3 3
Apple A11 128bit fma x3 3 3 3 3
Apple M1 128bit add/mul + 128bit fma x3 4 4 3 4
Haswell 256bit fma/add + 256bit fma/mul 1 2 2 2
Skylake 256bit fma + 256bit fma 2 2 2 2
IceLake 256bit fma + 256bit fma 2 2 2 2
Zen 128bit add x2 + 128bit mul x2 2 2 2 3
Zen+ 128bit add x2 + 128bit mul x2 2 2 2 3
Zen2 256bit add x2 + 256bit mul x2 2 2 2 4

SIMD SIMD 2 SIMD 4 SIMD 8 SIMD 16
CPU/SoC add mul fma total add mul fma total add mul fma total add mul fma total
S1 0.5 0.5 0.5 0.5 0.25 0.25 0.25 0.25
S2 0.5 0.5 0.5 0.5 0.25 0.25 0.25 0.25
S6 2 1 1 2 2 1 1 2
A5 1 1 1 1 1 1 1 1
A6 1 1 1 1 1 1 1 1
A7 3 2 2 3 3 2 2 3
A8 3 2 2 3 3 2 2 3
A9 3 3 3 3 3 3 3 3
A10 3 3 3 3 3 3 3 3
A11 3 3 3 3 3 3 3 3
M1 4 4 3 4 4 4 3 4
Haswell 1 2 2 2 1 2 2 2
Skylake 2 2 2 2 2 2 2 2
IceLake 2 2 2 2 2 2 2 2 1 1 1 1
Zen 2 2 2 3 1 1 1 2
Zen+ 2 2 2 3 1 1 1 2
Zen2 2 2 2 4 2 2 2 4

Intel CPU は AVX512 で最大 512bit 幅まで選べるものの同時に実行できる命令はいずれも 2命令までとなっています。

AMD Zen2 は add+mul の組み合わせで最大 4ですが、同じ種類の場合 2命令までとなります。Zen1 では 3命令に制限されていたようです。ちなみに Zen2 は通常の CPU (MCM) と APU (Monolithic) を比べましたが同じ結果でした。キャッシュサイズに違いはあるものの、特に浮動小数点演算の実行ユニットが削られているようなことはありませんでした。

Apple は A7 で 64bit 化と同時に 128bit fma x3 に拡張しています。ARM の Cortex は 64bit x2 なので、同じ ARM CPU でも 3倍の演算能力を持っており、スカラーや 64bit でも最大 1.5倍のスループットが期待できます。

さらに A9 で乗算も拡張されており、A12 以降いずれかのタイミングで 4命令に増加したと思われます。Intel が SIMD でピーク性能に特化しているのに対して、Apple は効率がよく小回りがきく印象です。

他の CPU や倍精度含めた表はこちらにあります。

CPU の浮動小数点演算能力の詳細

ARM core 自体ここ数年で性能がかなり上がっています。以前 Pixel 3 (Snapdragon 845/Cortex-A75) を使い始めたときに、ハイエンドスマートフォンが十分開発に使えるくらい速いことに気が付きました。Core i7 (4 core / 8 thread) の普通の PC とコンパイル時間がほとんど変わらなかったためです。

ARM CPU 上の開発環境とコンパイル時間の比較 (2) Pixel 3/UserLAnd

下記は Compile Benchmark からの抜粋です。4C8T の PC と Pixel3 のみ載せています。十分速いことがわかります。

Device/OS CPU thread ビルド時間
Desktop PC Windows WSL2 Core i7-6700K 4/8 29 sec
Desktop PC Ubuntu 18.04 Core i7-4790K 4/8 31 sec
Pixel 3 Android + Termux Snapdragon 845 8/8 35 sec
Desktop PC Windows WSL1 Core i7-6700K 4/8 40 sec
MacBook Air Early 2020 Core i5-1030NG7 4/8 45 sec
Mac mini Late 2012 Core i7-3615QM 4/8 46 sec

もともとコンパイルは並列化が有効で、多コア CPU や I/O 性能の違いで速度が出やすくなります。スマートフォン向け ARM CPU はシングルスレッド性能よりも core 数を増やす方に進化していたので、特に並列コンパイルと相性が良かったのだと思われます。

core 数よりもシングルスレッド性能に力を入れいてた Apple が、同じくらい core 数を揃えたのが前述の Apple A12X です。さらに世代を重ねて、改良と同時に動作 Clock を上げたのが Apple M1 になります。以前のテストでも、コンパイル速度は Apple M1 では 16C/32T に匹敵する結果が出ていました。予想を大きく上回るもので、ARM への移行は早く進むのではないかと思います。

MacBook Air Late 2020 / Apple M1 のビルド速度と浮動小数点演算能力

Device/OS CPU thread ビルド時間
Desktop PC Windows WSL2 Ryzen 9 3950X 16/32 8 sec
MacBook Air Late 2020 Apple M1 8/8 9 sec
Desktop PC Windows WSL2 Ryzen 7 4750G 8/16 18 sec
Desktop PC Windows WSL2 Ryzen 7 1800X 8/16 21 sec
MacBook Air Early 2020 Core i5-1030NG7 4/8 45 sec

関連ページ
CPU の浮動小数点演算能力の詳細
Compile Benchmark
VFP Benchmark Log 計測結果まとめ

関連エントリ
Apple Watch Series 6 と CPU 性能の測定
MacBook Air Late 2020 / Apple M1 のビルド速度と浮動小数点演算能力
Ice Lake の vfpbench 結果と AVX512 命令
Windows 10 WSL2 のコンパイル速度比較
4倍速い Ryzen 9 3950X の UE4 コンパイル速度
Huawei P30 Lite/Fire HD 10(2019) のコンパイル速度と UserLAnd
Jetson Nano / Clang の Version とコンパイル速度の比較
Snapdragon 835 と 845 のコンパイル時間の比較&浮動小数点演算能力
ARM CPU 上の開発環境とコンパイル時間の比較 (2) Pixel 3/UserLAnd