月別アーカイブ: 2020年12月

Apple Watch Series 6 と CPU 性能の測定

Apple Watch Series 6 に乗り換えました。4年前のモデル Apple Watch Series 2 からの移行です。4世代分の変化は極めて大きく、その性能の差をを思い知らされました。

Series 2 は操作していて待たされることが結構あります。

アプリ起動には時間がかかり、画面中央でドットの輪が回転する画面をしばらく見続けることになります。地図を起動しても最初に地形が出てくるまで 10秒以上かかりますしスクロールには読み込みが追いついていません。ワークアウトのメニューも画面切り替え直後に一瞬固まっていてタッチの反応が悪いこともあります。SIri の反応も遅く、きちんと聞こえているのか不安になって何度も話しかけがちです。スマートフォンと比べると制約も多いため、ある程度仕方がない部分もあるでしょう。

ところが、Apple Watch Series 6 は画面も操作もハイエンドスマートフォンのように滑らかで快適です。

アプリも即座に起動するし、地図の読み込みもスクロールに追従しており、Siri の呼びかけもすぐに応えてくれます。ワークアウトのメニューも固まらずにタッチに反応しており、操作にストレスがありません。

本当に快適になったので、どれくらいハードウエア性能が上がっているか調べてみました。vfpbench を移植し、実際に測定した結果をまとめています。

Apple Watch Series 2 Apple Watch Series 6
SOC Apple S2 Apple S6
CPU core Coretex-A7 Apple 独自 core
CPU arch armv7k (ARMv7A VFPv4) arm64_32 (ARMv8.3A+)
CPU Core数 2 2
CPU Clock 450 MHz 1.5 GHz
RAM 512 MB 1.5 GB
CPU fp16 49.8 GFLOPS
CPU fp32 1.8 GFLOPS 25.2 GFLOPS
CPU fp64 0.9 GFLOPS 12.5 GFLOPS

Series 6 は RAM を 1.5GB 搭載していることがわかりました。Series 2 と比べると容量は 3倍になっておりだいぶ余裕があります。Series 2 は watchOS 7 から対象外となっており、やはり RAM 容量に無理があったのではないかと思います。

CPU も 64bit (?) になり Clock も上がっています。fp32 の演算速度に限ってみるとピークで 14倍の速度が出ています。

●ログの詳細より

以前も書いていますが Series 2 の CPU core はおそらく Cortex-A7 だと思われます。個々の浮動小数点演算命令のスループットやレイテンシの傾向が Cortex-A7 によく似ているからです。

同時に CPU の clock も推測できます。スカラー命令の MOPS からおよそ 450MHz 前後であることがわかります。

下記はその抜粋です。

Apple Watch Series 2 (Apple S2) fp32

                                      TIME(s)   MFLOPS      MOPS     FOP   IPC
VFP fmuls (32bit x1) n8           :    1.387      432.5      432.5  (  1.0 0.0)
VFP fadds (32bit x1) n8           :    1.354      443.1      443.1  (  1.0 0.0)
VFP fmacs (32bit x1) n8           :    1.332      900.6      450.3  (  2.0 0.0)
~
NEON vmul.f32 (32bit x4) n12      :    8.046      447.4      111.9  (  4.0 0.0)
NEON vadd.f32 (32bit x4) n12      :    7.972      451.6      112.9  (  4.0 0.0)
NEON vmla.f32 (32bit x4) n12      :    8.449      852.1      106.5  (  8.0 0.0)
NEON vfma.f32 (32bit x4) n12      :    8.337      863.6      108.0  (  8.0 0.0)

同じように Series 6 の結果も見てみます。こちらはスカラーもベクターも同速であり、かつ加算命令が乗算の 2倍回っています。128bit SIMD でも速度が落ちないので、同時に実行できる命令は「128bit 加算 + 128 bit 積和」の組み合わせだと考えられます。

これが ARM の 64bit core なら「64bit 積和 x 2」なので、128bit SIMD がスカラーや 64bit SIMD と同じ速度になることがありません。Apple の独自 core であることがわかります。乗算命令の MOPS をみると動作クロックはおそらく 1.5GHz 前後でしょう。

Apple Watch Series 6 (Apple S6) fp32

                                      TIME(s)   MFLOPS      MOPS     FOP   IPC
FPU fmul (32bit x1) n8            :    0.390     1538.2     1538.2  (  1.0 0.0)
FPU fadd (32bit x1) n8            :    0.194     3089.5     3089.5  (  1.0 0.0)
FPU fmadd (32bit x1) n8           :    0.388     3091.1     1545.6  (  2.0 0.0)
~
NEON fmul.4s (32bit x4) n12       :    0.585     6156.1     1539.0  (  4.0 0.0)
NEON fadd.4s (32bit x4) n12       :    0.291    12381.2     3095.3  (  4.0 0.0)
NEON fmla.4s (32bit x4) n12       :    0.581    12386.1     1548.3  (  8.0 0.0)

Apple Watch の 64bit CPU である Apple S4/S5/S6 は fp16 (半精度/16bit 浮動小数点) の演算命令に対応しています。Xcode で arm64_32 (Apple Watch 64bit) をターゲットにビルドを行うと clang が下記のマクロを定義することから判断できます。

#define __ARM_FEATURE_FP16_SCALAR_ARITHMETIC 1
#define __ARM_FEATURE_FP16_VECTOR_ARITHMETIC 1

実際に vfpbench でも fp16 演算命令が走っており、fp32 の倍の速度が出ています。iOS でいえば arm64e に相当するので、arm64_32 も同じ世代だと仮定するなら ARMv8.3A が対象となります。おそらく A12 以降の LITTLE core が用いられているのではないでしょうか。

Apple Watch Series 6 (Aple S6) fp16

                                      TIME(s)   MFLOPS      MOPS     FOP   IPC
NEON fmul.8h (16bit x8) n12       :    0.583    12350.5     1543.8  (  8.0 0.0)
NEON fadd.8h (16bit x8) n12       :    0.290    24794.4     3099.3  (  8.0 0.0)
NEON fmla.8h (16bit x8) n12       :    0.582    24729.8     1545.6  ( 16.0 0.0)

● arm64_32

説明に出てきた arm64_32 は Apple Watch 専用のアーキテクチャタイプです。表にまとめてみます。

watchOS
armv7k ILP32 ARMv7A + VFPv4 (Apple S1~S3 )
arm64_32 ILP32 ARMv8.3A (Apple S4 ~)
iOS/tvOS
armv6 ILP32 ARMv6 (ARM11) (iPhone 2G/3G)
armv7 ILP32 ARMv7A + VFPv3 (3GS~A5)
armv7s ILP32 ARMv7A + VFPv4 (Apple A6)
arm64 LP64 ARMv8A (Apple A7 ~ A11)
arm64e LP64 ARMv8.3A (Apple A12 ~)

arm64_32 は、ARM の 64bit アーキテクチャである ARMv8A Aarch64 の命令セットを採用していながら ILP32 (ポインタサイズが 32bit) の構成を使用しています。そのため 64bit といいつつも実質 32bit です。ILP32 なら ARMv7A もしくは ARMv8A AArch32 と何が違うのか?と思うかもしれませんが、別物になっています。arm64_32 はアドレスが 32bit なだけで AArch64 の命令が動きます。

ARM は生まれたときから 32bit の命令セットでしたが、ARMv8 で 64bit 化するときに全く新しいものに置き換わりました。レジスタも命令の種類もエンコーディングも違います。

例えば ARM 32bit では殆どの命令で条件付き実行やシフタが内蔵されていましたが 64bit 命令にはありません。他の RISC CPU のような Zero Register も登場します。ほぼ別の CPU となっており、Intel の IA-32 と IA-64 の関係に似ているかもしれません。

ARM の 64bit CPU は ARMv7A 互換の AArch32 (32bit) と新しい AArch64 (64bit) の 2 種類の命令デコーダーを持っていることになります。ILP32 として 32bit CPU 相当の使い方をするなら、AArch32 を使った方がコード資産を引き継げるし都合が良いように思えます。しかしながら Apple Watch は AArch64 のまま 32bit 化しているので、何かしらの理由があるのでしょう。

Apple は iOS 11 のタイミングで 32bit アプリを廃止して一切起動できなくなりました。同時に iOS 11 を搭載して出荷されたのが iPhone X (Apple A11) なので、Apple A11 以降は AArch32 mode が不要であると言えます。そもそも実行できない可能性があります。もしくはパフォーマンス面や消費電力、セキュリティなどの面で ARMv8.x 以降の命令に依存しているのかもしれません。

Wear OS (Android Wear) のスマートウォッチは最初に登場した初期モデルからスペックが共通で Snadpragon 400 / 210 ベースのまま変わっていません。新型が出ても性能はほぼ据え置きとなっています。対する Apple Watch は毎年新モデルが登場し、それに合わせて搭載 SoC も進化していることがよくわかります。

ログの全体は下記のページにあります。
VFP Benchmark Log 計測結果まとめ

関連エントリ
MacBook Air Late 2020 / Apple M1 のビルド速度と浮動小数点演算能力
セサミmini、スマートロックを使って1年
2年間使った Apple Watch Series 2
Apple Watch S2 の CPU と浮動小数点演算