前回の x64 VNNI 命令の TOPS 計測に続いて ARM CPU の TOPS 値も求めてみました。vfpbench による実測です。
結果
| SoC | arch | Core数 | 命令 | INT8 tops |
|---|---|---|---|---|
| Snapdragon 8s Gen 4 | v8.2A X4 A720 A720 A720 | 1+2+3+2 | I8MM | 4.200 TOPS |
| Tensor G5 (Pixel 10 Pro) | v9.2A X4 A725 A520 | 1+5+2 | I8MM | 3.173 TOPS |
| Snapragon 7+ Gen 3 | v8.2A X4 A720 A520 | 1+4+3 | I8MM | 2.400 TOPS |
| Tensor G4 (Pixel 9a) | V9.2A X4 A720 A520 | 1+3+4 | I8MM | 2.202 TOPS |
| Snapdragon 6 Gen 1 | V8.2A A78 A55 | 4+4 | DotProd | 0.789 TOPS |
INT8 TOPS で最も演算能力が高かったのは Snapdragon 8s Gen4 で、CPU だけでも 4.2 TOPS 出ています。同じ 8 core でも Snapdragon 8s Gen4 はすべて big Core なので、その分演算能力が高くなっています。
前回の x64 CPU の結果と比べると以下のとおり。SIMD 幅が 128bt の Mobile Arm CPU でも INT8 演算能力は Desktop CPU と比べて遜色ないレベルに見えます。これは Arm CPU が VNNI のような内積命令だけでなく、Matrix の乗算命令 I8MM を持っているためです。
| CPU | Arch | Core数 | 命令 | INT8 TOPS |
|---|---|---|---|---|
| Ryzen AI Max+ 395 | Zen5 | 16C 32T | AVX512-VNNI | 20.482 TOPS |
| Ryzen 7 9700X | Zen5 | 8C 16T | AVX512-VNNI | 10.699 TOPS |
| Core i7-13700 | RaptorCove | 16C 24T | AVX-VNNI | 5.456 TOPS |
| Ryzen 7 7840HS | Zen4 | 8C 16T | AVX512-VNNI | 4.713 TOPS |
| Snapdragon 8s Gen 4 | X4 A720 | 8C 8T | I8MM | 4.200 TOPS⭐️ |
| Ryzen 7 5700X | Zen3 | 8C 16T | AVX2 | 3.547 TOPS |
| Ryzen 9 3950X | Zen2 | 16C 32T | AVX2 | 3.178 TOPS |
| Tensor G5 (Pixel 10 Pro) | X4 A725 A520 | 8C 8T | I8MM | 3.173 TOPS⭐️ |
| Snapdragon 7+ Gen 3 | X4 A720 A520 | 8C 8T | I8MM | 2.400 TOPS⭐️ |
| Tensor G4 (Pixel 9a) | X4 A720 A520 | 8C 8T | I8MM | 2.202 TOPS⭐️ |
| Ryzen 7 4750G | Zen2 | 8C 16T | AVX2 | 1.629 TOPS |
| Snapragon 6 Gen 1 | A78 A55 | 8C 8T | DotProd | 0.789 TOPS⭐️ |
| Intel N97 | Gracemont | 4C 4T | AVX-VNNI | 0.366 TOPS |
I8MM 命令
x64 の VNNI に相当する命令は Arm にも搭載されており DotProd (udot/sdot) です。DotProd は 32bit 単位で 4要素同士の内積を行います。128bit で 32 iops になります。
I8MM 命令 (smmla/ummla/usmmla) は 2×8と 8×2 のマトリクス乗算が可能で、それぞれ各 8bit 値が 2回ずつ利用されます。64bit 単位、8要素の内積を 4組実行します。128bit で 32個の積和演算が可能で、命令あたりの演算回数は 64 iops となります。レジスタへの再転送なしに DotProd と比較して 2倍の演算ができるわけです。
また結果を見ると Cortex-X4 の場合 DotProd/I8MM は同時に 4命令実行可能であることがわかります。以下は Google Tensor G5 (Pixel 10 Pro) の Cortex-X4 の結果からの抜粋です。
Cortex-X4 TIME(s) MFLOPS MOPS IOP IPC
NEON smmla.4s (int8 x16) n12 : 0.272 799709.3 12495.5 ( 64.0 3.3)
NEON ummla.4s (int8 x16) n12 : 0.227 959218.0 14987.8 ( 64.0 4.0) ⭐️
NEON usmmla.4s (int8 x16) n12 : 0.225 966448.1 15100.8 ( 64.0 4.0) ⭐️
NEON sdot.4s (int8 x16) n12 : 0.225 483251.9 15101.6 ( 32.0 4.0)
NEON udot.4s (int8 x16) n12 : 0.225 483342.0 15104.4 ( 32.0 4.0)よって CPU Core あたり最大 256 iops となり、これは AMD Ryzen Zen5 の AVX512-VNNI に匹敵します。
ただしこれだけ強力なのは Prime Core の X4 だけで、Mobile SoC の場合は大抵 1~2 core しか搭載されていません。Cortex-A725/A720 の場合は半分の同時 2命令、LITTEL Core (E-Core) の Cortex-A520 の場合は 2 Pipe が 2 CPU で共有されているため実質 1 命令です。
下の表は CPU Core 毎の INT8 演算能力の比較です。
| CPU Core | 対応命令 | bit幅 | clockあたり | CORE あたりの演算数 |
|---|---|---|---|---|
| Cortex-X4 | I8NN | 128bit | x4 | 256 iops |
| Cortex-A725/A720 | I8NN | 128bit | x2 | 128 iops |
| Cortex-A520 | I8NN | 128bit | x1 (実質) | 64 iops |
| Zen5 | AVX512-VNNI | 512bit | x 2 | 256 iops |
| Zen4 | AVX512-VNNI | 512bit | x 1 | 128 iops |
| RaptorLake (RaptorCove) P-Core | AVX-VNNI | 256bit | x 2 | 128 iops |
| AlderLake-N (Gracemont) E-Core | AVX-VNNI | 256bit | x 0.5 | 32 iops |
BF16 命令
TOPS とは直接関係ないのですが、AI 向けの演算命令として bfloat16 命令があります。bfloat16 は 16bit の浮動小数点フォーマットの一種で、一般的な fp16 の s10e5 ではなく s7e8 になります。仮数部の精度は 8bit しかありませんが、その代わり指数部のレンジも 8bit あり fp32 と同等です。
Arm CPU には I8MM 同様 bfloat16 にも 2×4 と 4×2 のマトリクス乗算命令 bfmmla があります。結果は fp32 です。fp16 には同等の命令がないので、16bit のピーク FLOPS 値は fp16 よりも bfloat16 の方が高くなっています。
単純に考えると bit 数が倍なので 8bit I8MM の半分のレートになるように見えますが、結果を見ると 8bit int の 1/4 となっています。以下は Tensor G5 の Cortex-X4 の結果の抜粋です。INT8 が 966 TOPS なのに対して BF16 はおよそ 1/4 の 230~250 FLOPS となっています。
Cortex-X4
Group 2: Thread=1 Clock=3.782000 GHz (mask:80)
SingleThread HP max: 181.306 GFLOPS ← INT8 の 3/16
SingleThread SP max: 90.649 GFLOPS ← INT8 の 3/32
SingleThread DP max: 45.310 GFLOPS ← INT8 の 3/64
SingleThread BF16 max: 253.620 GFLOPS ← INT8 の 1/4
SingleThread INT8 max: 966.281 GOPS ← INT8
MultiThread HP max: 138.243 GFLOPS
MultiThread SP max: 67.191 GFLOPS
MultiThread DP max: 45.303 GFLOPS
MultiThread BF16 max: 229.727 GFLOPS
MultiThread INT8 max: 966.448 GOPSCortex-X4 の bfmmla 命令は I8MM の smmla/ummla/usmmla とは異なり同時に 2命令しか実行できないことが原因です。以下は Cortex-X4 の bfmmla 命令の抜粋です。
Cortex-X4 TIME(s) MFLOPS MOPS FOP IPC
NEON bfmmla.4s (bf16 x8) n12 : 0.429 253620.4 7925.6 ( 32.0 2.1) ⭐️
NEON bfdot.2s (bf16 x4) n12 : 0.451 60410.1 7551.3 ( 8.0 2.0)
NEON bfdot.4s (bf16 x8) n12 : 0.368 148077.4 9254.8 ( 16.0 2.4)ちなみに fp16 命令 (HP) は 181 GFLOPS と INT8 の 3/16 になっています。Cortex-X4 の浮動小数点積和命令は 3命令同時に実行できるため、4命令実行可能な I8MM と比べて (3/4) ✕ (16 iop / 64 iop) = 3/16 となります。
Cortex-A725/A720 の場合は INT8 も BF16 も同じ 2命令なので、BF16 はちょうど 1/2 となっています。また浮動小数点積和も 2命令で同じなので、fp16 (HP) もぴったり 1/4 です。
Cortex-A725
Group 1: Thread=5 Clock=3.052000 GHz (mask:7c)
SingleThread HP max: 97.521 GFLOPS
SingleThread SP max: 48.758 GFLOPS
SingleThread DP max: 24.377 GFLOPS
SingleThread BF16 max: 194.937 GFLOPS
SingleThread INT8 max: 390.017 GOPS
MultiThread HP max: 487.591 GFLOPS ← INT8 の 1/4
MultiThread SP max: 243.788 GFLOPS ← INT8 の 1/8
MultiThread DP max: 121.888 GFLOPS ← INT8 の 1/16
MultiThread BF16 max: 917.726 GFLOPS ← INT8 の 1/2
MultiThread INT8 max: 1950.065 GOPS ← INT8Cortex-A520 の場合は bfmmla は一つの ALU を複数コアで共有しており、シングルスレッド時に 1命令、マルチスレッドでは 0.5 に半減します。実測値を見ると理論値よりも値が小さくなっていますが、おそらくレイテンシが大きいためだと思われます。
Cortex-A520 TIME(s) MFLOPS MOPS FOP IPC
NEON bfmmla.4s (bf16 x8) n12 : 1.264 51177.2 1599.3 ( 32.0 0.7)
NEON bfdot.2s (bf16 x4) n12 : 0.929 17408.1 2176.0 ( 8.0 1.0)
NEON bfdot.4s (bf16 x8) n12 : 0.927 34897.8 2181.1 ( 16.0 1.0)Aarm A520 のマニュアルによると Exec Latency は 14~15 cycle となっており、また bfloat16 の演算は VMAC と VALU を両方占有する特殊な命令であることもわかります。
- Arm Cortex-A520 Core Software Optimization Guide
まとめ
Arm CPU も AI 向けの演算命令が強化されており、高い演算能力を持っていることがわかります。今後 SME/SME2 によってさらにマトリクス演算命令は強化されていくようです。Apple M4 以降や C1 ではすでにこれらの命令が搭載されているため、さらに高いスループットが得られるものと思われます。
計測データのリンク
- Qualcomm Snapdragon 8s Gen 4 Xiaomi POCO F7
- Qualcomm Snapdragon 7+ Gen 3 iPlay70 mini Ultra
- Qualcomm Snapdragon 6 Gen 1 iPlay 60 mini Turbo
- Google Tensor G5 Pixel 10 Pro
- Google Tensor G4 Pixel 9a


