arm」タグアーカイブ

Pixel 9a Tensor G4 の浮動小数点演算能力と Linux ターミナル

Pixel 9a で vfpbench を走らせてみました。vfpbench は CPU の浮動小数点演算能力の理論的なピーク値に焦点を当てたベンチマークです。

以下の表は Pixel 8/8a との比較のための抜粋です。動作クロックが上がっている分だけシングル性能は高いはずですが、1コア減っているためマルチスレッドでは差がつきません。Pixel 8 比では全体的に低い値になっています。Pixel 8a の Single (Cortex-X3) の値が極端に低いですが、おそらく測定時に発熱で制限(サーマルスロットリング)がかかり、クロックが上がらなかったためと思われます。

fp32 SingleFP32 MULTIFP64 SINGLEFP64 MULTI
Pixel 869.7 GFLOPS281.9 GFLOPS28.0 GFLOPS139.6 GFLOPS
Pixel 8a37.7 GFLOPS245.1 GFLOPS18.8 GFLOPS122.2 GFLOPS
Pixel 9a67.9 GFLOPS256.5 GFLOPS33.8 GFLOPS127.4 GFLOPS
SINGLE = Single Thread、MULTI = Multi Thread

全部のデータはこちらで参照できます。

個々の命令の特性を見ると、クロックあたりのピークの浮動小数点演算能力はほぼ同等で特性もかなり似通ったものになっていることがわかります。

Tensor G4 自体は G3 と比べると CPU コアの世代が上がっています。以下は CPU コアの比較表です。

TENSOR G1TENSOR G2TENSOR G3TENSOR G4
PrimeX1 (x2)X1 (x2)X3 (x1)X4 (x1)
BigA76 (x2)A78 (x2)A715 (x4)A720 (x3)
LittleA55 (x4)A55 (x4)A510 (x4)A520 (x4)

Tensor G3 で唯一 32bit 命令2対応していた A510 が無くなり、Tensor G4 では完全に 64bit 命令のみ対応の CPU コアに置き換わりました。Tensor G4 では ARM の 32bit 命令のプログラムは動きません。ARM の各 CPU コアの 32bit 命令対応についてはこちらの記事を参照してください。

もっとも、OS としては Pixel 7 の Tensor G2 世代から 32bit アプリケーションには非対応となっており、すでに完全に 64bit に置き換わっています。そのため 32bit 対応コアがなくなっても影響はありませんのでご安心ください。

vfpbench の話しに戻ります。Tensor G4 の LITTLE コア A520 は 4個搭載されていますが、シングル時の浮動小数点演算性能に対して、4コアマルチスレッドでも 4倍ではなく 2倍にしかなっていません。 以下は LITTLE コアだけの比較になります。

FP32 SINGLEFP32 MULTIFP64 SINGLEFP64 MULTI
Pixel 7a (A55)14.0 GFLOPS54.7 GFLOPS7.0 GFLOPS27.8 GFLOPS
Pixel 8 (A510)27.1 GFLOPS61.3 GFLOPS13.5 GFLOPS29.1 GFLOPS
Pixel 8a (A510)27.0 GFLOPS56.6 GFLOPS13.5 GFLOPS28.0 GFLOPS
Pixel 9a (A520)30.9 GFLOPS62.7 GFLOPS15.4 GFLOPS31.7 GFLOPS
SINGLE = Single Thread、MULTI = Multi Thread

例えば Pixel 9a (A520) の FP32 SINGLE は 30.9 GFLOPS ですが、FP32 MULLTI でも約 2倍の 62.7 GFLOPS しかありません。これは A520 が A510 と同じように 2コアで浮動小数点演算ユニットを共有しているためだと考えられます。

A55 時代の Pixel 7a (Tensor G2) では Multi 時のスコアに対して Single の値が 1/4 になっています。つまり A510/A520 は A55 と比べて Single 時の性能が 2倍になっているわけです。

また LITTLE コアだけの比較では Pixel 8/8a の G3 よりも Pixel 9a の G4 の方が速度が上がっています。それぞれクロック差の影響がきちんとスコアに反映されています。同様に同じ G3 を搭載した Pixel 8 と 8a のパフォーマンスも同等です。LITTLE コアは電力効率が良いためにサーマルスロットリングの影響を受けなかったのだと思われます。

A510 におけるコアの共有についてはこちらで解説しています。

Linux 開発環境 (ターミナル) が 9a で使えないことについて

Pixel 9a を実際に使ってみて少々予想外だった点は、Linux 開発環境 (ターミナル) 機能が使えなかったことです。

「Linux 開発環境」は Pixel の OS に標準で含まれている Linux のコマンドラインの動作環境です。ChromeOS の同名の機能、もしくは Windows の WSL に相当します。Linux 開発環境 (ターミナル) 機能については以下の記事で解説しています。

おそらく使えないのは発売当初だけで、将来の OS 更新によって Pixel 9a でもサポートするのではないかと思われます。

幸いなことに、発売したばかりの Pixel 9a も Android 16 のベータプログラムに含まれていることがわかりました。Pixel 9a でも Android 16 Beta 4 をインストールすると、開発者向けオプショにから Linux 開発環境を有効にすることができました。

どうしても今すぐ Pixel 9a で Linux を使いたいという場合はベータプログラムを利用するのも一つの手かもしれません。もちろんメインのスマートフォンとして使用している場合はお勧めしません。

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 系の命令が増えていますので、そちらも後ほど調べてみたいと思います。

関連エントリ

ARM CPU の 64bit/32bit 命令対応

最近の ARM CPU Core は 32bit 命令への対応が徐々に無くなりつつあり 64bit 命令のみ動作するようになっています。

Apple はすでに iOS11 の段階で 64bit に完全移行しており 32bit のアプリが動作しません。同時にプロセッサも 32bit 命令が廃止されており、Apple A11 (iPhone8/X) 以降は AArch32(ARMv7) 命令非対応となっています。

同じように ARM の CPU Core も完全な 64bit 化が進んでいます。ARM Core の世代と 32bit/64bit への対応状況をまとめてみました。

ARMv8 世代の CPU までは 32bit/64bit 両方の命令に対応していますが、ARMv9 世代になってからは段階的に 32bit 命令が廃止されてきていることがわかります。

Apple の watchOS のように、ILP32 で 32bit OS ながら対応命令が 64bit (AArch64) のみとなっているものもあります。(詳しくはこちら「Apple Watch Series 6 と CPU 性能の測定」)

関連エントリ

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

関連エントリ