arm」タグアーカイブ

Arm CPU の INT8 TOPS 値も計測してみる

前回の x64 VNNI 命令の TOPS 計測に続いて ARM CPU の TOPS 値も求めてみました。vfpbench による実測です。

結果

SoCarchCore数命令INT8 tops
Snapdragon 8s Gen 4v8.2A X4 A720 A720 A7201+2+3+2I8MM4.200 TOPS
Tensor G5 (Pixel 10 Pro)v9.2A X4 A725 A5201+5+2I8MM3.173 TOPS
Snapragon 7+ Gen 3v8.2A X4 A720 A5201+4+3I8MM2.400 TOPS
Tensor G4 (Pixel 9a)V9.2A X4 A720 A5201+3+4I8MM2.202 TOPS
Snapdragon 6 Gen 1V8.2A A78 A554+4 DotProd0.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 を持っているためです。

CPUArchCore数命令INT8 TOPS
Ryzen AI Max+ 395Zen516C 32TAVX512-VNNI20.482 TOPS
Ryzen 7 9700XZen58C 16TAVX512-VNNI10.699 TOPS
Core i7-13700RaptorCove16C 24TAVX-VNNI5.456 TOPS
Ryzen 7 7840HSZen48C 16TAVX512-VNNI4.713 TOPS
Snapdragon 8s Gen 4X4 A7208C 8TI8MM4.200 TOPS⭐️
Ryzen 7 5700XZen38C 16TAVX23.547 TOPS
Ryzen 9 3950XZen216C 32TAVX23.178 TOPS
Tensor G5 (Pixel 10 Pro)X4 A725 A5208C 8TI8MM3.173 TOPS⭐️
Snapdragon 7+ Gen 3X4 A720 A5208C 8TI8MM2.400 TOPS⭐️
Tensor G4 (Pixel 9a)X4 A720 A5208C 8TI8MM2.202 TOPS⭐️
Ryzen 7 4750GZen28C 16TAVX21.629 TOPS
Snapragon 6 Gen 1A78 A558C 8TDotProd0.789 TOPS⭐️
Intel N97Gracemont4C 4TAVX-VNNI0.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-X4I8NN128bitx4256 iops
Cortex-A725/A720I8NN128bitx2128 iops
Cortex-A520I8NN128bitx1 (実質)64 iops
Zen5AVX512-VNNI512bitx 2256 iops
Zen4AVX512-VNNI512bitx 1128 iops
RaptorLake (RaptorCove) P-CoreAVX-VNNI256bitx 2128 iops
AlderLake-N (Gracemont) E-CoreAVX-VNNI256bitx 0.532 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 GOPS

Cortex-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       INT8

Cortex-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 CPU も AI 向けの演算命令が強化されており、高い演算能力を持っていることがわかります。今後 SME/SME2 によってさらにマトリクス演算命令は強化されていくようです。Apple M4 以降や C1 ではすでにこれらの命令が搭載されているため、さらに高いスループットが得られるものと思われます。

計測データのリンク

関連ページ

vfpbench のカテゴリ一覧

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

関連エントリ