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 と浮動小数点演算