SVE/SVE2 は ARM の新しい SIMD 命令です。特徴は、従来よりも長いサイズのベクタを扱えるようになったことです。AVX512 のマスクレジスタと同じように Predicate Register を持っており、任意長のベクタとしても扱うことができます。
AVX512 と違って CPU 側の実際のレジスタサイズは任意です。128bit の倍数なら何でもよく、最大で 2048bit になります。レジスタ長に応じてループ回数やマスク値を設定する命令が存在しており、CPU 毎の実装の違いを吸収することができます。
Tensor G3 は ARMv9 の CPU Coretex-X3/A715/A510 を搭載しているため SVE/SVE2 命令に対応しています。Cortex-X3/A715/A510 のレジスタサイズは 128bit でした。これは NEON 命令と同じなので、浮動小数点演算のピーク性能自体はどちらを使っても変わらないと思われます。
vfpbench に SVE 命令を追加したので Pixel 8 で試してみました。
Cortex-A510 SingleT SP FLOPS IPC
NEON fmul.4s (32bit x4) n12 : 0.454 13519.8 3379.9 ( 4.0 2.0)
NEON fadd.4s (32bit x4) n12 : 0.453 13543.1 3385.8 ( 4.0 2.0)
NEON fmla.4s (32bit x4) n12 : 0.453 27055.6 3382.0 ( 8.0 2.0)
SVE fmul.s (32bit xN) n12 : 0.453 13529.6 3382.4 ( 4.0 2.0)
SVE fadd.s (32bit xN) n12 : 0.454 13523.3 3380.8 ( 4.0 2.0)
SVE fmla.s (32bit xN) n12 : 0.453 27080.5 3385.1 ( 8.0 2.0)
Cortex-A715 SingleT SP FLOPS IPC
NEON fmul.4s (32bit x4) n12 : 0.452 18864.7 4716.2 ( 4.0 2.0)
NEON fadd.4s (32bit x4) n12 : 0.452 18868.5 4717.1 ( 4.0 2.0)
NEON fmla.4s (32bit x4) n12 : 0.452 37731.6 4716.5 ( 8.0 2.0)
SVE fmul.s (32bit xN) n12 : 0.451 18897.2 4724.3 ( 4.0 2.0)
SVE fadd.s (32bit xN) n12 : 0.452 18847.1 4711.8 ( 4.0 2.0)
SVE fmla.s (32bit xN) n12 : 0.452 37717.2 4714.6 ( 8.0 2.0)
Cortex-X3 SingleT SP FLOPS IPC
NEON fmul.4s (32bit x4) n12 : 0.676 46546.0 11636.5 ( 4.0 4.0)
NEON fadd.4s (32bit x4) n12 : 0.678 46425.0 11606.2 ( 4.0 4.0)
NEON fmla.4s (32bit x4) n12 : 0.902 69792.8 8724.1 ( 8.0 3.0)
SVE fmul.s (32bit xN) n12 : 0.675 46594.6 11648.6 ( 4.0 4.0)
SVE fadd.s (32bit xN) n12 : 0.679 46365.2 11591.3 ( 4.0 4.0)
SVE fmla.s (32bit xN) n12 : 0.901 69842.9 8730.4 ( 8.0 3.0)
右端の IPC を見るとわかりやすいでしょう。シングルスレッド単精度による結果の比較ですが、やはり 128bit 演算になるため NEON、SVE どちらも結果に違いはありませんでした。もちろん 256bit や 512bit 対応 CPU では結果が異なりますし、マスクレジスタを利用できるという大きなメリットもあります。
SVE とは関係ないですが、少々気になるのは Cortex-A510 の結果です。128bit 命令の IPC が 2 となっており、これは Tensor G2 の Cortex-A55 と比べると 2倍の数値となります。この結果だけ見るとクロックあたりの浮動小数点演算演算能力が上位 CPU と同じ水準まで強化されているように見えます。
そのため A55 世代と比べると全体のピーク FLOPS 値が大きく伸びているはずですが、結果を見ると思ったほど上がっていません。以下の表は A55 との比較です。シングルスレッド性能は 2倍になっているのにマルチスレッド性能はあまり変わっていないことがわかります。
SoC | CPU Core | Clock | core数 | Single-T SP | MULTI-T SP |
---|---|---|---|---|---|
Tensor G3 | Cortex-A510 | 1.70 GHz | 4 | 27.1 GFLOPS | 61.3 GFLOPS |
Tensor G2 | Cortex-A55 | 1.80 GHz | 4 | 14.0 GFLOPS | 54.7 GFLOPS |
その要因はマルチスレッド時の各命令の詳細をみると明らかです。マルチスレッド実行時は Cortex-A510 の演算能力 (IPC) が半減しています。
Cortex-A510 SingleT SP FLOPS IPC
NEON fmul.4s (32bit x4) n12 : 0.454 13519.8 3379.9 ( 4.0 2.0)
NEON fadd.4s (32bit x4) n12 : 0.453 13543.1 3385.8 ( 4.0 2.0)
NEON fmla.4s (32bit x4) n12 : 0.453 27055.6 3382.0 ( 8.0 2.0)
SVE fmul.s (32bit xN) n12 : 0.453 13529.6 3382.4 ( 4.0 2.0)
SVE fadd.s (32bit xN) n12 : 0.454 13523.3 3380.8 ( 4.0 2.0)
SVE fmla.s (32bit xN) n12 : 0.453 27080.5 3385.1 ( 8.0 2.0)
Cortex-A510 MultiT SP FLOPS IPC
NEON fmul.4s (32bit x4) n12 : 0.885 27730.1 1733.1 ( 16.0 1.0)
NEON fadd.4s (32bit x4) n12 : 0.907 27041.8 1690.1 ( 16.0 1.0)
NEON fmla.4s (32bit x4) n12 : 0.906 54190.8 1693.5 ( 32.0 1.0)
SVE fmul.s (32bit xN) n12 : 0.909 26991.1 1686.9 ( 16.0 1.0)
SVE fadd.s (32bit xN) n12 : 0.904 27150.5 1696.9 ( 16.0 1.0)
SVE fmla.s (32bit xN) n12 : 0.801 61290.4 1915.3 ( 32.0 1.1)
AMD Bulldozer 系のように演算ユニットが複数のコアで共有されているか、もしくはマルチスレッド高負荷時のクロック制限の可能性などを考えましたが、結果は前者でした。Arm CortexA510 Core Software Optimization Guide によると A510 の浮動小数点演算ユニットはどうやら 2 core で共有されているようです。
よって Cortex-A510 では 64bit 命令の場合は core あたり 2命令ですが、128bit 命令はシングルスレッドでピーク 2命令、マルチスレッドでは競合した場合 1命令までに制限されます。
以下の表は他の CPU との比較です。
SOC | PRIME | BIG | LITTLE | 合計CORE数 | S-SP | M-SP |
---|---|---|---|---|---|---|
Tensor G3 | X3 2.91GHz x1 | A715 2.37GHz x4 | A510 1.70GHz x4 | 9 | 69.8 | 281.9 |
Tensor G2 | X1 2.85GHz x2 | A78 2.35GHz x2 | A55 1.80GHz x4 | 8 | 48.8 | 227.5 |
Kirin 980 | A76 2.60GHz x2 | A76 1.92GHz x2 | A55 1.80GHz x4 | 8 | 41.5 | 186.7 |
Helio G99 | A76 2.20GHz x2 | A55 2.00GHz x6 | 8 | 35.2 | 163.8 |
Cortex-X3 は 128bit で 4命令実行できる点は X1 と変わりませんが、fma のスループットが向上しておりそれが S-SP の結果に反映されています。X1 では fma の IPC が 2 でしたが X3 では 3 命令同時に実行できています。
Cortex-X3/A715/A510 では他にも i8mm や bf16 など ML 系の命令が増えていますので、そちらも後ほど調べてみたいと思います。