neon」タグアーカイブ

Google Tensor G3 の浮動小数点演算性能と SVE

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倍になっているのにマルチスレッド性能はあまり変わっていないことがわかります。

SoCCPU CoreClockcore数Single-T SPMULTI-T SP
Tensor G3Cortex-A5101.70 GHz427.1 GFLOPS61.3 GFLOPS
Tensor G2Cortex-A551.80 GHz414.0 GFLOPS54.7 GFLOPS
↑ 浮動小数点演算命令単精度のピーク値、FLOPS の値が大きい方が高速

その要因はマルチスレッド時の各命令の詳細をみると明らかです。マルチスレッド実行時は 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 との比較です。

SOCPRIMEBIGLITTLE合計CORE数S-SPM-SP
Tensor G3X3 2.91GHz x1A715 2.37GHz x4A510 1.70GHz x4969.8281.9
Tensor G2X1 2.85GHz x2A78 2.35GHz x2A55 1.80GHz x4848.8227.5
Kirin 980A76 2.60GHz x2A76 1.92GHz x2A55 1.80GHz x4841.5186.7
Helio G99A76 2.20GHz x2A55 2.00GHz x6835.2163.8
↑ 浮動小数点演算命令単精度のピーク値、S-SP/M-SP の単位は GFLOPS。FLOPS の値が大きい方が高速

Cortex-X3 は 128bit で 4命令実行できる点は X1 と変わりませんが、fma のスループットが向上しておりそれが S-SP の結果に反映されています。X1 では fma の IPC が 2 でしたが X3 では 3 命令同時に実行できています。

Cortex-X3/A715/A510 では他にも i8mm や bf16 など ML 系の命令が増えていますので、そちらも後ほど調べてみたいと思います。

関連エントリ

Pixel 7a Google Tensor G2 の vfpbench の結果

Google の Pixel 7a は Pixel 7 や Fold と同じ Tensor G2 が搭載されています。Tensor G2 でも vfpbench を走らせてみました。

Tensor G2 には 3種類の CPU Core が搭載されています。

Cortex-A55x41.80 GHz
Cortex-A78x22.35 GHz
Cortex-X1x22.85 GHz

それぞれの結果を詳しく見ると、A55 はスカラーの add, mul, fma や 64bit 演算で 2命令走りますが 128bit 演算では 1命令です。よって 64bit 演算 x2 の構成であることがわかります。

A55
FPU fmul (32bit x1) n8            :    0.319     3389.7     3389.7  (  1.0 1.9)
FPU fadd (32bit x1) n8            :    0.334     3243.8     3243.8  (  1.0 1.8)
FPU fmadd (32bit x1) n8           :    0.319     6785.6     3392.8  (  2.0 1.9)
NEON fmul.4s (32bit x4) n12       :    0.924     7027.6     1756.9  (  4.0 1.0)
NEON fadd.4s (32bit x4) n12       :    0.928     6995.3     1748.8  (  4.0 1.0)
NEON fmla.4s (32bit x4) n12       :    0.924    14046.3     1755.8  (  8.0 1.0)

対して A78 はスカラーも 128bit 演算も変わらず 2命令で一定なので、128bit x2 になります。

A78
FPU fmul (32bit x1) n8            :    0.301     4676.9     4676.9  (  1.0 2.0)
FPU fadd (32bit x1) n8            :    0.301     4678.5     4678.5  (  1.0 2.0)
FPU fmadd (32bit x1) n8           :    0.301     9353.7     4676.9  (  2.0 2.0)
NEON fmul.4s (32bit x4) n12       :    0.452    18712.2     4678.1  (  4.0 2.0)
NEON fadd.4s (32bit x4) n12       :    0.452    18713.6     4678.4  (  4.0 2.0)
NEON fmla.4s (32bit x4) n12       :    0.452    37368.1     4671.0  (  8.0 2.0)

最上位の Cortex-X1 はスカラー・ベクター関係なく add/mul 演算で 4命令、fma で 2命令です。fma のピーク値だけ見るとあまり差がないように見えますが、128bit x4 と演算能力が大きく拡張されており高いスループットが期待できます。

X1
FPU fmul (32bit x1) n8            :    0.151    11337.4    11337.4  (  1.0 4.0)
FPU fadd (32bit x1) n8            :    0.150    11370.1    11370.1  (  1.0 4.0)
FPU fmadd (32bit x1) n8           :    0.301    11364.5     5682.3  (  2.0 2.0)
NEON fmul.4s (32bit x4) n12       :    0.226    45347.7    11336.9  (  4.0 4.0)
NEON fadd.4s (32bit x4) n12       :    0.226    45353.3    11338.3  (  4.0 4.0)
NEON fmla.4s (32bit x4) n12       :    0.448    45813.8     5726.7  (  8.0 2.0)

まとめると以下の通りです。

s-adds-muls-fmav-addv-mulv-fma
Cortex-A5522211164bit x2
Cortex-A78222222128bit x2
Cortex-X1442442128bit x4

関連エントリ