VR
oga at 00:56
Oculus Quest 2 を入手しました。性能が上がりつつ価格も下がっており、今 VR を始めるなら間違いなくこれが候補にあがるのではないかと思います。ケーブルも外部センサーも不要なモバイル VR でありながらルームスケールに対応しており、Oculus Link を使えば PC の VR ゲームもプレイできます。

Oculus Quest 1 とスペックを比較してみます。

Oculus Quest Oculus Quest 2
SoC Snapdragon 835 Snapdragon XR2
CPU Kryo 280 (A73 + A53) Kryo 585 (A77 + A55)
CPU Clock 2.5GHz / 1.9GHz 2.8GHz / 2.4GHz / 1.8GHz
RAM 4GB 6GB
GPU Adreno 540 Adreno 650
OS Adnroid 7.1 (API 25) Android 10 (API 29)
Display OLED 1440 x 1600 x2 LCD 1832 x 1920 x2
IPD調節 無段階 3段階のみ
発売 2019/05 2020/10
価格 49800円 (64GB) 37100円 (64GB)

VR HMD はハイエンド向けとモバイル向けに分かれています。ハイエンド向けではトラッキングの精度やトラッカーの数でまだまだ Lighthouse 方式が優勢でしょう。モバイル向けでは仕様的に Oculus Quest で完成されており、Quest 2 はさらなる機能強化が図られています。

まずパネル解像度が上がっており、片目だけで Full HD の 1.7倍 (1920x1832) に達しています。Quest 1 と比べても明らかにドットの隙間が見えにくくなっているのがわかります。

HMD ROM 価格 重さ RAM 画面 解像度比
Oculus Go 32GB 23800円 $199 468g 3GB 2560x1440 1.00
Oculus Go 64GB 29800円 $249 468g 3GB 2560x1440 1.00
Oculus Quest 64GB 49800円 $399 571g 4GB 2880x1600 1.25
Oculus Quest 128GB 62800円 $499 571g 4GB 2880x1600 1.25
Oculus Quest2 64GB 37100円 $299 503g 6GB 3664x1920 1.91
Oculus Quest2 256GB 49200円 $399 503g 6GB 3664x1920 1.91

ガーディアンの外に出ると外部カメラの画像に切り替わりますが、Quest 2 の方が歪みが減って明るくなっており、そのまま違和感なく歩けます。

プロセッサも強化されています。スペックを調べると CPU は 1+3+4 構成の Octa core で、それぞれ 2.8GHz, 2.4GHz, 1.8GHz でした。GPU も Adreno 650 だったので、Snapdragon XR2 は Snapdrago 865 をベースにしていると思われます。

基本性能が強化された反面、コストダウンが見える部分もあります。Oculus Go と同じゴムバンドになっており、軽量化されているものの装着時の安定度は Quest 1 の方が上です。また小型化のためか内部の空間に余裕がなくなり、スペーサーを入れてもメガネがかなり入りづらくなっています。

一番残念だったのが、画面を見ながら IPD の微調整ができなくなっていることです。一旦 HMD を外してから直接レンズ部分をずらす必要があり、切り替えも 3段階のみとなっています。

また新しく Oculus デバイスをセットアップする場合は Facebook アカウントが必要です。


● Bluetooth Keyboard

Oculus Quest の UI は更新されており、外部ツールを使わなくても設定から Bluetooth Keyboard をペアリングできるようになっています。Quest 1 でもできるようになっています。

・設定 → テスト機能 → Bluetooth ペアリング

ただしキーボードレイアウトの変更はできないので、日本語配列などレイアウトを切り替えたい場合はやはり TVLauncerGo などの外部ツールから Android 本来の設定画面を呼び出す必要があります。レイアウト変更手順は下記の通り。

・TVLauncerGo → 設定 → システム → 言語と入力 → 物理キーボード → 物理キーボードを選択 → キーボードレイアウトの設定


● TVLauncherGo の呼び出し

Oculus Quest 1 と同じように TVLauncherGo が動きました。アカウントを開発者登録してから PC と USB で接続し、adb コマンドでインストールしています。

Oculus Go で一般 Android アプリを起動できるランチャーを作ってみた
GitHub: TVLauncherGo

Oculus TV がシステムに統合されているため、以前の解説と起動方法は異なっています。

1. Oculus ボタンのメニューから「アプリ」を選択
2. 右上のプルダウンを「すべて」にする
3. 右上の「テレビ」を選択
4. テレビアプリの左から「チャンネル」→「提供元不明のアプリ」

Quest2 TVLauncherGo

Quest2 TVLauncherGo

もしくは下記の方法でも直接呼び出せます。

1. アプリの右上のプルダウンを「提供元不明」にする
2. 直接 TV Launcher Go を選ぶ。

Quest2 TVLauncherGo


● Termux / UserLAnd

Termux は Version によっては動かないことがあるようです。昨年 2020/10 月に試したときは、Quest 1 で使っていた古いバージョンを使用しました。

UserLAnd は問題なくインストールできました。VNC を使うときに注意が必要な点も Quest 1 と同じです。Termux は単独で起動できますが、UserLAnd は TVLauncherGo 経由で呼び出す必要があります。詳しくは下記をご覧ください。

Oculus Quest も文章書き&開発マシンにする

なお Android 10 になったため CTRL+SPACE の入力ができなくなっています。Quest 1 は Android 7.1 なので入力できました。

UserLAnd : Android 9.0 で Ctrl + SPACE を使えるようにする


関連エントリ
Oculus Quest で Rift のゲームをプレイする (Oculus Link)
Oculus Quest 5万円ちょうどで買えるフルスペック VR
Oculus Quest も文章書き&開発マシンにする
Android/Oculus Go/Daydream の画面をミラーリングするツールを作ってみた
Oculus Go で一般 Android アプリを起動できるランチャーを作ってみた
VR で物が大きく見えたり小さく見えたりするわけ
Oculus Go は VR ができる新しい携帯ゲーム機


PlayStation はおよそ 6~7 年で新しい機種が出ています。歴代のメモリ容量を比べてみると、一世代毎にちょうど 16倍に増えていることがわかります。この法則で行けば PlayStation 5 のメモリ容量は 8GB × 16 で 128GB になるはず、なのですが実際は 16 GB で 2倍に増えただけでした。(PS5 Press release)

発売年 PlayStation RAM 容量 前世代比
1994 PlayStation 2 MB --
2000 PlayStation 2 32 MB 16倍
2006 PlayStation 3 512 MB 16倍
2013 PlayStation 4 8 GB 16倍
2020 PlayStation 5 16 GB (128 GB?) 2倍 (16倍?)

RAM 128GB は PC を見てもコスト的にまだ厳しいように見えますし、VRAM を 128GB 搭載したビデオカードもまだ出ていません。

期待されるメモリ容量との差をカバーしているのがおそらく高速 SSD になります。今の世代で力が入っているのはむしろストレージの方で、この 7年の変化は RAM よりも SSD の方が大きかったのでしょう。

専用 SSD によってロード時間を限りなく短縮できるならメモリ容量の限界を超えることに繋がります。限られたコストで中途半端に RAM を増やすよりも、ストレージに力を入れた方がより効果的だとの判断があったのではないかと思います。

なお上の表には若干ごまかしがあります。昔の機種は VRAM や Sound Memory が別だったので、それらを含めると PS1/PS2 の容量は増えます。さらに PS3 は最初から VRAM 込みの値になってます。修正すると下記の通り。

発売年 PlayStation System Memory Memory 合計 前世代比
1994 PlayStation 2 MB 3 MB --
2000 PlayStation 2 32 MB 38 MB 13倍
2006 PlayStation 3 256 MB 512 MB 13倍
2013 PlayStation 4 8 GB 8 GB 16倍
2020 PlayStation 5 16 GB 16 GB 2倍

関連エントリ
PlayStation 4
PS3 PPU は速いのか


久しぶりに Intel Mac を使うと、コンパイルがなかなか終わらなくてあれ?と思うことがあります。以前比べたときは、同じ 2020年モデル同士の比較ながらビルド時間で 5倍ほどの差がありました。

M1 Mac が速い理由は色々あると思いますが、そもそもシンプルに CPU が速いです。これまで直接比較できるプラットフォームが無かっただけで、Apple の CPU はシングルスレッド性能が高くパフォーマンスが良好でした。

2018年に A12X を搭載した第3世代 iPad Pro が登場した時点ですでに「ほとんどのノートパソコンよりも優れたパフォーマンス」(ノートパソコンの92パーセントよりも高速)と謳っていることからもわかります。

先日 Apple Watch Series 6 の Apple S6 について性能を測定しました。合わせて手持ちの他のデバイスも一通りチェックしたのでその結果をまとめてみます。ログの全体はこちらにあります。


浮動小数点演算の同時に実行できる命令数 (IPC) に注目したのが下記の表です。単精度と一部の CPU のみ抜き出しています。あくまで浮動小数点演算命令しか見ていないので、必ずしも全体の性能を見ているわけではない点にご注意ください。

float 32bit Scalar
CPU/SoC SIMD Width add mul fma total
Apple S1 32bit fma 1 1 1 1
Apple S2 32bit fma 1 1 1 1
Apple S6 128bit add + 128bit fma 2 1 1 2
Apple A5 128bit mad 1 1 1 1
Apple A6 128bit fma 1 1 1 1
Apple A7 128bit add + 128bit fma x2 3 2 2 3
Apple A8 128bit add + 128bit fma x2 3 2 2 3
Apple A9 128bit fma x3 3 3 3 3
Apple A10 128bit fma x3 3 3 3 3
Apple A11 128bit fma x3 3 3 3 3
Apple M1 128bit add/mul + 128bit fma x3 4 4 3 4
Haswell 256bit fma/add + 256bit fma/mul 1 2 2 2
Skylake 256bit fma + 256bit fma 2 2 2 2
IceLake 256bit fma + 256bit fma 2 2 2 2
Zen 128bit add x2 + 128bit mul x2 2 2 2 3
Zen+ 128bit add x2 + 128bit mul x2 2 2 2 3
Zen2 256bit add x2 + 256bit mul x2 2 2 2 4

SIMD SIMD 2 SIMD 4 SIMD 8 SIMD 16
CPU/SoC add mul fma total add mul fma total add mul fma total add mul fma total
S1 0.5 0.5 0.5 0.5 0.25 0.25 0.25 0.25 -- -- -- -- -- -- -- --
S2 0.5 0.5 0.5 0.5 0.25 0.25 0.25 0.25 -- -- -- -- -- -- -- --
S6 2 1 1 2 2 1 1 2 -- -- -- -- -- -- -- --
A5 1 1 1 1 1 1 1 1 -- -- -- -- -- -- -- --
A6 1 1 1 1 1 1 1 1 -- -- -- -- -- -- -- --
A7 3 2 2 3 3 2 2 3 -- -- -- -- -- -- -- --
A8 3 2 2 3 3 2 2 3 -- -- -- -- -- -- -- --
A9 3 3 3 3 3 3 3 3 -- -- -- -- -- -- -- --
A10 3 3 3 3 3 3 3 3 -- -- -- -- -- -- -- --
A11 3 3 3 3 3 3 3 3 -- -- -- -- -- -- -- --
M1 4 4 3 4 4 4 3 4 -- -- -- -- -- -- -- --
Haswell -- -- -- -- 1 2 2 2 1 2 2 2 -- -- -- --
Skylake -- -- -- -- 2 2 2 2 2 2 2 2 -- -- -- --
IceLake -- -- -- -- 2 2 2 2 2 2 2 2 1 1 1 1
Zen -- -- -- -- 2 2 2 3 1 1 1 2 -- -- -- --
Zen+ -- -- -- -- 2 2 2 3 1 1 1 2 -- -- -- --
Zen2 -- -- -- -- 2 2 2 4 2 2 2 4 -- -- -- --

Intel CPU は AVX512 で最大 512bit 幅まで選べるものの同時に実行できる命令はいずれも 2命令までとなっています。

AMD Zen2 は add+mul の組み合わせで最大 4ですが、同じ種類の場合 2命令までとなります。Zen1 では 3命令に制限されていたようです。ちなみに Zen2 は通常の CPU (MCM) と APU (Monolithic) を比べましたが同じ結果でした。キャッシュサイズに違いはあるものの、特に浮動小数点演算の実行ユニットが削られているようなことはありませんでした。

Apple は A7 で 64bit 化と同時に 128bit fma x3 に拡張しています。ARM の Cortex は 64bit x2 なので、同じ ARM CPU でも 3倍の演算能力を持っており、スカラーや 64bit でも最大 1.5倍のスループットが期待できます。

さらに A9 で乗算も拡張されており、A12 以降いずれかのタイミングで 4命令に増加したと思われます。Intel が SIMD でピーク性能に特化しているのに対して、Apple は効率がよく小回りがきく印象です。

他の CPU や倍精度含めた表はこちらにあります。

CPU の浮動小数点演算能力の詳細


ARM core 自体ここ数年で性能がかなり上がっています。以前 Pixel 3 (Snapdragon 845/Cortex-A75) を使い始めたときに、ハイエンドスマートフォンが十分開発に使えるくらい速いことに気が付きました。Core i7 (4 core / 8 thread) の普通の PC とコンパイル時間がほとんど変わらなかったためです。

ARM CPU 上の開発環境とコンパイル時間の比較 (2) Pixel 3/UserLAnd

下記は Compile Benchmark からの抜粋です。4C8T の PC と Pixel3 のみ載せています。十分速いことがわかります。

Device/OS CPU thread ビルド時間
Desktop PC Windows WSL2 Core i7-6700K 4/8 29 sec
Desktop PC Ubuntu 18.04 Core i7-4790K 4/8 31 sec
Pixel 3 Android + Termux Snapdragon 845 8/8 35 sec
Desktop PC Windows WSL1 Core i7-6700K 4/8 40 sec
MacBook Air Early 2020 Core i5-1030NG7 4/8 45 sec
Mac mini Late 2012 Core i7-3615QM 4/8 46 sec

もともとコンパイルは並列化が有効で、多コア CPU や I/O 性能の違いで速度が出やすくなります。スマートフォン向け ARM CPU はシングルスレッド性能よりも core 数を増やす方に進化していたので、特に並列コンパイルと相性が良かったのだと思われます。

core 数よりもシングルスレッド性能に力を入れいてた Apple が、同じくらい core 数を揃えたのが前述の Apple A12X です。さらに世代を重ねて、改良と同時に動作 Clock を上げたのが Apple M1 になります。以前のテストでも、コンパイル速度は Apple M1 では 16C/32T に匹敵する結果が出ていました。予想を大きく上回るもので、ARM への移行は早く進むのではないかと思います。

MacBook Air Late 2020 / Apple M1 のビルド速度と浮動小数点演算能力

Device/OS CPU thread ビルド時間
Desktop PC Windows WSL2 Ryzen 9 3950X 16/32 8 sec
MacBook Air Late 2020 Apple M1 8/8 9 sec
Desktop PC Windows WSL2 Ryzen 7 4750G 8/16 18 sec
Desktop PC Windows WSL2 Ryzen 7 1800X 8/16 21 sec
MacBook Air Early 2020 Core i5-1030NG7 4/8 45 sec


関連ページ
CPU の浮動小数点演算能力の詳細
Compile Benchmark
VFP Benchmark Log 計測結果まとめ

関連エントリ
Apple Watch Series 6 と CPU 性能の測定
MacBook Air Late 2020 / Apple M1 のビルド速度と浮動小数点演算能力
Ice Lake の vfpbench 結果と AVX512 命令
Windows 10 WSL2 のコンパイル速度比較
4倍速い Ryzen 9 3950X の UE4 コンパイル速度
Huawei P30 Lite/Fire HD 10(2019) のコンパイル速度と UserLAnd
Jetson Nano / Clang の Version とコンパイル速度の比較
Snapdragon 835 と 845 のコンパイル時間の比較&浮動小数点演算能力
ARM CPU 上の開発環境とコンパイル時間の比較 (2) Pixel 3/UserLAnd


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


2020年後期の新型 MacBook Air (Apple M1 ARM) のビルド速度と vfpbench の結果です。2020年前期発売の Intel モデルと比べて 5倍高速でした。

Device CPU Thread Time
MacBook Air Late2020 Apple M1 arm64 8/8 9 sec
MacBook Air Early2020 Core i5-1030NG7 4/8 45 sec
Mac mini L2012 Core i7-3615QM 4/8 47 sec
MacBook Pro Late2012 Core i5-3210M 2/4 125 sec

・↑コンパイル時間の比較。Time が小さい方が速い。

vfpbench の結果は下記の通りです。macOS では LITTLE core だけ Affinity で固定することができないので Multi-Thread の値はまだ不正確です。そのため Single Thread だけ比較しています。

↓vfpbench の Single Thread の結果のみ抜粋

Device CPU Thread Half Single Double
MacBook Air Early2020 Core i5-1030NG7 4/8 -- 111.3 55.6
MacBook Air Late2020 Apple M1 arm64 8/8 153.1 76.6 38.3
MacBook Air Late2020 Apple M1 x86_64 8/8 -- 34.1 17.1
Pixl 3 Snapdragon 845 Cortex-A75+A55 8/8 44.4 22.3 11.2
PH-1 Snapdragon 835 Cortex-A73+A53 8/8 -- 19.5 9.8

・↑Half/Single/Double の数値は GFLOPS。値が大きい方が速い。

Apple M1 の結果詳細(抜粋)
                                      TIME(s)   MFLOPS      MOPS     FOP   IPC
FPU fmul (32bit x1) n8            :    0.157    12195.9    12195.9  (  1.0 3.8)
FPU fadd (32bit x1) n8            :    0.150    12799.9    12799.9  (  1.0 4.0)
FPU fmadd (32bit x1) n8           :    0.301    12753.6     6376.8  (  2.0 2.0)
NEON fmul.2s (32bit x2) n8        :    0.150    25593.3    12796.7  (  2.0 4.0)
NEON fadd.2s (32bit x2) n8        :    0.150    25570.3    12785.2  (  2.0 4.0)
NEON fmla.2s (32bit x2) n8        :    0.302    25441.6     6360.4  (  4.0 2.0)
NEON fmul.4s (32bit x4) n12       :    0.225    51167.5    12791.9  (  4.0 4.0)
NEON fadd.4s (32bit x4) n12       :    0.225    51086.7    12771.7  (  4.0 4.0)
NEON fmla.4s (32bit x4) n12       :    0.301    76531.6     9566.5  (  8.0 3.0)

この結果より、SIMD (NEON) は 128bit FMA (fmla) が 3命令同時に走っており、ピーク値は 1 cycle あたり 24fop であることがわかります。256bit FMA が 2命令走る Haswell/Zen2/3 は 32 fop 、AVX512 では最大 64 fop なので、単 core でのピーク FLOPS はそれよりも落ちます。

その代わり注目すべきは IPC の方で、FMA で 3命令、ADD/MUL でサイクルあたりのスループットが 4命令です。Intel は 128bit でも最大 2命令、Zen2 では Add + Mul の組合わせのみ 4命令なので、スカラーや 128bit 演算は Apple M1 の方が速度出る可能性があります。

FLOPS 表の「Apple M1 x86_64」は Rosetta によるバイナリ変換で実行した場合のものです。AVX/FMA 命令が動かなかったので SSE4.2 までのオプションでビルドしています。FMA がないのでピーク値は半減していますが、加減算命令の IPC は 3~4 と高い値を維持していました。

コンパイル時間の比較を参考用に載せておきます。OS と SSD、使用したコンパイラが異なるので単純に比較できませんのでご了承ください。また必ずしもあらゆるタスクでこの性能差が生じるわけではありません。特にビルドに時間がかかる巨大なプロジェクトではかなり遅くなると思います。

Device CPU SSD Thread Time
Windows Desktop WSL2 Ryzen 9 3950x SATA 16/32 8 sec
MacBook Air Late2020 Apple M1 arm64 NVMe 8/8 9 sec
WIndows Desktop WSL2 Ryzen 7 PRO 4750G SATA 8/16 18 sec
Linux Desktop Core i7-6700k SATA 4/8 29 sec
Linux Desktop Core i7-4790k SATA 4/8 31 sec
Pxiel3 Snapdragon 845 Coretex-A75+A55 eMMC 8/8 35 sec
PH-1 Snapdragon 835 Coretex-A73+A53 eMMC 8/8 40 sec
MacBook Air Early2020 Core i5-1030NG7 NVMe 8/8 45 sec
Mac mini Late 2012 Core i7-3615QM SATA 4/8 47 sec
MacBook Pro Late 2012 Core i5-3210M SATA 2/4 125 sec
Raspberry Pi 4 Coretex-A72 SD 4/4 146 sec


上記以外の他のデバイスとの比較はこちら↓にあります。

Compile Benchmark


関連ページ
Hyperでんち: Compile Benchmark
Hyperでんち: vfpbench 結果まとめ

関連エントリ
Ice Lake の vfpbench 結果と AVX512 命令
4倍速い Ryzen 9 3950X の UE4 コンパイル速度
Snapdragon 845 ARMv8.2A 半精度 fp16 演算命令を使ってみる / Deep Learning 命令
Snapdragon 835 と 845 のコンパイル時間の比較&浮動小数点演算能力
Snapdragon 845 の浮動小数点演算速度
ARM CPU の浮動小数点演算能力まとめ
HTC 10 Snapdragon 820 Kyro の浮動小数点演算能力
iPhone SE, Apple A9 の浮動小数点演算速度
ARM Cortex-A53 の浮動小数点演算速度とコンパイル時間の比較
iPod touch 6 の浮動小数点演算速度は Core 2 Duo ライン超え
iPad Air 2 (Apple A8X) の浮動小数点演算能力
ARM cpu vfp の種類と fp16 命令を使ってみる


| 次のページ(日付が古い方向)>>