2021/01/01
Apple M1 とそれまでの Apple CPU の比較など
久しぶりに Intel Mac を使うと、コンパイルがなかなか終わらなくてあれ?と思うことがあります。以前比べたときは、同じ 2020年モデル同士の比較ながらビルド時間で 5倍ほどの差がありました。
M1 Mac が速い理由は色々あると思いますが、そもそもシンプルに CPU が速いです。これまで直接比較できるプラットフォームが無かっただけで、Apple の CPU はシングルスレッド性能が高くパフォーマンスが良好でした。
2018年に A12X を搭載した第3世代 iPad Pro が登場した時点ですでに「ほとんどのノートパソコンよりも優れたパフォーマンス」(ノートパソコンの92パーセントよりも高速)と謳っていることからもわかります。
先日 Apple Watch Series 6 の Apple S6 について性能を測定しました。合わせて手持ちの他のデバイスも一通りチェックしたのでその結果をまとめてみます。ログの全体はこちらにあります。
浮動小数点演算の同時に実行できる命令数 (IPC) に注目したのが下記の表です。単精度と一部の CPU のみ抜き出しています。あくまで浮動小数点演算命令しか見ていないので、必ずしも全体の性能を見ているわけではない点にご注意ください。
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 のみ載せています。十分速いことがわかります。
もともとコンパイルは並列化が有効で、多コア 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 のビルド速度と浮動小数点演算能力
関連ページ
・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
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
2020/12/30
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 を移植し、実際に測定した結果をまとめています。
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 前後であることがわかります。
下記はその抜粋です。
同じように 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 の 64bit CPU である Apple S4/S5/S6 は fp16 (半精度/16bit 浮動小数点) の演算命令に対応しています。Xcode で arm64_32 (Apple Watch 64bit) をターゲットにビルドを行うと clang が下記のマクロを定義することから判断できます。
実際に vfpbench でも fp16 演算命令が走っており、fp32 の倍の速度が出ています。iOS でいえば arm64e に相当するので、arm64_32 も同じ世代だと仮定するなら ARMv8.3A が対象となります。おそらく A12 以降の LITTLE core が用いられているのではないでしょうか。
● arm64_32
説明に出てきた arm64_32 は Apple Watch 専用のアーキテクチャタイプです。表にまとめてみます。
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 と浮動小数点演算
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
#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倍高速でした。
・↑コンパイル時間の比較。Time が小さい方が速い。
vfpbench の結果は下記の通りです。macOS では LITTLE core だけ Affinity で固定することができないので Multi-Thread の値はまだ不正確です。そのため Single Thread だけ比較しています。
↓vfpbench の Single Thread の結果のみ抜粋
・↑Half/Single/Double の数値は GFLOPS。値が大きい方が速い。
Apple M1 の結果詳細(抜粋)
この結果より、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、使用したコンパイラが異なるので単純に比較できませんのでご了承ください。また必ずしもあらゆるタスクでこの性能差が生じるわけではありません。特にビルドに時間がかかる巨大なプロジェクトではかなり遅くなると思います。
上記以外の他のデバイスとの比較はこちら↓にあります。
・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 命令を使ってみる
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 命令を使ってみる
2020/08/16
Ice Lake の vfpbench 結果と AVX512 命令
Ice Lake の PC (mac) を手に入れたので vfpbench を AVX512 対応にしてみました。結果は下記のとおりです。
・Core i5-1030NG7 (MacBook Air)
AVX512 は、512bit 単位の演算が可能となる Intel の新しい SIMD 命令セットです。AVX/AVX2 は 256bit 幅なので 2倍に増えたことになります。単精度の浮動小数点演算なら 512/32bit = 16並列です。4x4 matrix が 1レジスタに収まります。
SSE から AVX に進化したときと同じように、命令のエンコードも一新されており機能も増えています。SSE → AVX では 3オペランドになり 64bit 時に 16個のレジスタが利用できました。AVX → AVX512 ではレジスタフィールドが 5bit となり、レジスタ数が 32個に増えています。さらに 7個の mask レジスタを併用することができます。
mask レジスタは初期の GPU の Shader にあった書き込みマスクと同じものです。出力レジスタのうち必要な要素のみ置き換えることができます。残りの部分は元の値が残りますが、保存せずにゼロクリアを行うこともできます。
mask レジスタが導入されたことで、大きくて一見小回りがきかないようにみえる 512bit のレジスタも、任意のベクタ長とみなして扱うことができます。単精度なら 16個分ですが、mask を併用すれば 1~15 個の単位でも読み書きができるわけです。
SSE/AVX では少々扱いづらかった x,y,z の 3要素ベクタも簡単にロードすることができます。 下記の例ではベクタ (x,y,z) を 4個まとめて読み込んでいます。長さ 12 のベクタとして読み込んだあと、それぞれ (x,y,z) → (x,y,z,0) に展開しています。
AVX2 でも gather を使えば似たようなことができますが、どちらかといえば gather 命令は Shader の InputAssembler に相当します。
もちろん常時マスク付きで演算を行うと無駄が生じていることになります。GPU の SIMT のように、SoA で扱う方が AVX512 の本来の形かもしれません。この場合レジスタはベクタではなく 16個(単精度の場合)のスカラーとなり、mask レジスタは 16個のフラグレジスタとみなせます。
例えば↑こんな感じのコードを 16並列で実行すると↓こうなります。
比較命令の結果であるフラグ値は mask レジスタに入るので、条件成立時と不成立時の演算結果をそのまま合成することができます。
AVX512 の説明が少々長くなりましたが、IceLake の vfpbench の結果を見てみます。ピークの GFLOPS 値は AVX(FMA3) 命令でも AVX512 命令でも変わっていないことがわかります。Ice Lake の場合 zmm (512bit) の AVX512F 命令は同時に 1命令しか実行できないようです。
この結果は Intel のサイトでも確認できます。
・Intel: Intrinsics Guide
上記ページの「__m512 _mm512_fmadd_ps (__m512 a, __m512 b, __m512 c)」を見ると、Icelake の throughput は 1 なので実行に 1 cycle かかることがわかります。対して Skylake (server)/Knights Landing の方は 0.5 なので、2 命令実行できることを意味しています。
また同じ AVX512 の命令でも、mask 付きの ymm(256bit) は AVX/FMA 同様 2命令実行できています。Intrinsics Guide で確認してみると throughput は 0.5 なので合っているようです。
よって IceLake の場合は、性能を上げるために無理に AVX512 命令を使う必要は無さそうです。ただし最初に紹介したように、AVX512 ではレジスタが倍増し便利な機能も命令も増えています。mask が使える便利な AVX2 として見ても十分使い物になるのではないでしょうか。
反面 CPU によって対応機能が細かく別れてしまうので、最適化と互換性の両立はますます難しくなりそうです。
なお vfpbench の log で IPC に大きな数値が出ているのは CPU のベースクロックを元にしているためです。今回使用した Core i5-1030NG7 はベースが 1.1GHz で Single Thread の Boost 時に 3.5GHz になります。そのため 3.5/1.1 の 3.18 がおよそ IPC=1 と思ってください。
より詳細なログは下記からどうぞ
・Hyperでんち: VFP Benchmark Log 計測結果まとめ
関連エントリ
・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 命令を使ってみる
・Intel AVX その3 命令
・Intel AVX その2 転送
・Intel AVX
AVX512 | reg | GFLOPS | fop | IPC | |
---|---|---|---|---|---|
AVX512VL | vmulps | ymm 256bit | 55.2 | 8 | 6.3 |
AVX512VL | vaddps | ymm 256bit | 55.6 | 8 | 6.3 |
AVX512VL | vfmaddps | ymm 256bit | 111.3 | 16 | 6.3 |
AVX512F | vmulps | zmm 512bit | 53.7 | 16 | 3.1 |
AVX512F | vaddps | zmm 512bit | 54.0 | 16 | 3.1 |
AVX512F | vfmaddps | zmm 512bit | 108.0 | 32 | 3.1 |
AVX512F | vfmadd+mulps | zmm 512bit | 81.0 | 24 | 3.1 |
AVX512F | vfmadd+addps | zmm 512bit | 81.2 | 24 | 3.1 |
・Core i5-1030NG7 (MacBook Air)
AVX512 は、512bit 単位の演算が可能となる Intel の新しい SIMD 命令セットです。AVX/AVX2 は 256bit 幅なので 2倍に増えたことになります。単精度の浮動小数点演算なら 512/32bit = 16並列です。4x4 matrix が 1レジスタに収まります。
SSE から AVX に進化したときと同じように、命令のエンコードも一新されており機能も増えています。SSE → AVX では 3オペランドになり 64bit 時に 16個のレジスタが利用できました。AVX → AVX512 ではレジスタフィールドが 5bit となり、レジスタ数が 32個に増えています。さらに 7個の mask レジスタを併用することができます。
mask レジスタは初期の GPU の Shader にあった書き込みマスクと同じものです。出力レジスタのうち必要な要素のみ置き換えることができます。残りの部分は元の値が残りますが、保存せずにゼロクリアを行うこともできます。
mask レジスタが導入されたことで、大きくて一見小回りがきかないようにみえる 512bit のレジスタも、任意のベクタ長とみなして扱うことができます。単精度なら 16個分ですが、mask を併用すれば 1~15 個の単位でも読み書きができるわけです。
SSE/AVX では少々扱いづらかった x,y,z の 3要素ベクタも簡単にロードすることができます。 下記の例ではベクタ (x,y,z) を 4個まとめて読み込んでいます。長さ 12 のベクタとして読み込んだあと、それぞれ (x,y,z) → (x,y,z,0) に展開しています。
movl $0x0fff, %eax kmovw %eax, %k1 movl $0x7777, %eax kmovw %eax, %k2 movups data(%rbp), %zmm0{%k1}{z} ; mask 0xfff で読み込み vexpandps %zmm0, %zmm1{%k2}{z} ; mask 0xfff -> 0x7777 に展開
AVX2 でも gather を使えば似たようなことができますが、どちらかといえば gather 命令は Shader の InputAssembler に相当します。
もちろん常時マスク付きで演算を行うと無駄が生じていることになります。GPU の SIMT のように、SoA で扱う方が AVX512 の本来の形かもしれません。この場合レジスタはベクタではなく 16個(単精度の場合)のスカラーとなり、mask レジスタは 16個のフラグレジスタとみなせます。
float d= n.dot( l );
if( d < 0 ){
c+= a;
}else{
c+= b * d;
}
if( d < 0 ){
c+= a;
}else{
c+= b * d;
}
例えば↑こんな感じのコードを 16並列で実行すると↓こうなります。
vmulps %zmm8, %zmm11, %zmm20 vfmadd231ps %zmm9, %zmm12, %zmm20 vfmadd231ps %zmm10, %zmm13, %zmm20 vcmpps $1, %zmm20, %zmm18, %k1 knotw %k1, %k2 vfmadd231ps %zmm20, %zmm19, %zmm21{%k1} vaddps %zmm17, %zmm21, %zmm21{%k2}
比較命令の結果であるフラグ値は mask レジスタに入るので、条件成立時と不成立時の演算結果をそのまま合成することができます。
AVX512 の説明が少々長くなりましたが、IceLake の vfpbench の結果を見てみます。ピークの GFLOPS 値は AVX(FMA3) 命令でも AVX512 命令でも変わっていないことがわかります。Ice Lake の場合 zmm (512bit) の AVX512F 命令は同時に 1命令しか実行できないようです。
AVX | reg | GFLOPS | fop | IPC | |
---|---|---|---|---|---|
FMA3 | vfmaddps | ymm 256bit | 111.0 | 16 | 6.3 |
AVX512VL | vfmaddps | ymm 256bit | 111.3 | 16 | 6.3 |
AVX512F | vfmaddps | zmm 512bit | 108.0 | 32 | 3.1 |
この結果は Intel のサイトでも確認できます。
・Intel: Intrinsics Guide
上記ページの「__m512 _mm512_fmadd_ps (__m512 a, __m512 b, __m512 c)」を見ると、Icelake の throughput は 1 なので実行に 1 cycle かかることがわかります。対して Skylake (server)/Knights Landing の方は 0.5 なので、2 命令実行できることを意味しています。
また同じ AVX512 の命令でも、mask 付きの ymm(256bit) は AVX/FMA 同様 2命令実行できています。Intrinsics Guide で確認してみると throughput は 0.5 なので合っているようです。
よって IceLake の場合は、性能を上げるために無理に AVX512 命令を使う必要は無さそうです。ただし最初に紹介したように、AVX512 ではレジスタが倍増し便利な機能も命令も増えています。mask が使える便利な AVX2 として見ても十分使い物になるのではないでしょうか。
反面 CPU によって対応機能が細かく別れてしまうので、最適化と互換性の両立はますます難しくなりそうです。
なお vfpbench の log で IPC に大きな数値が出ているのは CPU のベースクロックを元にしているためです。今回使用した Core i5-1030NG7 はベースが 1.1GHz で Single Thread の Boost 時に 3.5GHz になります。そのため 3.5/1.1 の 3.18 がおよそ IPC=1 と思ってください。
より詳細なログは下記からどうぞ
・Hyperでんち: VFP Benchmark Log 計測結果まとめ
関連エントリ
・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 命令を使ってみる
・Intel AVX その3 命令
・Intel AVX その2 転送
・Intel AVX
2019/01/05
Snapdragon 845 の浮動小数点演算速度
Snapdragon 845 の CPU は Qualcomm の Kryo 385 が使われています。big.LITTLE の 8 core (4+4) 非対称構成なので、ぞれぞれの CPU core 毎に測定してみました。下記はいずれも big.LITTLE 構成の CPU を使った SoC です。
・big = big core, little = little core
・Total = Multi thread の合計
vfpbench の単精度の結果のみ抜き出しています。単位は GFLOPS 。数値が大きい方が高速です。
表の CPU は Kryo, Kryo 385 (A75), Cortex-A57 いずれも 64bit x2 pipe なので、ピーク性能の差は純粋に core 数と clock 数で決まっています。
同様に little core の Cortex-A53/A55 も 64bit x2 の FP pipe を持っているので、数値上はほぼクロック差だけの違いとなっています。32bit 時代の little core Cortex-A7 と比べると性能は大きく上がっています。
初代 Kryo は Qualcomm 独自 core ですが、Snapdragon 845 の Kyro 385 は ARM Cortex-A75 + A55 がベースになっているようです。そのため Snapdragon 845 Kryo 385 の特性は初代 Kryo は異なっています。
例えば Kyro と Kyo 385 は積和命令のピーク演算はどちらも同一ながら、加算だけなら Snapdragon 821 の Kryo の方が 2倍速く回っています。
下記の表は 1 cycle に実行できる命令数 (IPC)
Kryo 385 のもとになった Cortex-A75 は ARM の新しい命令セットに対応しています。
以前の fp16 (半精度浮動小数点) 対応は変換命令だけでした。ロードストアは fp16 でも演算は fp32 以上に変換してから行います。v8.2 対応の A75/A55 では Deep Learning 向けに 16bit 命令が強化されています。fp16 のまま直接演算できるようになりました。
・ARM FPU (VFP/NEON) の種類
例えば NEON (Advanced SIMD) では 128bit 時に 8並列で演算が行われます。単精度 32bit と比べると 2倍の速度が出るはずなので、余裕があったら試してみたいと思います。
テストに使った機種の詳細
関連エントリ
・ARM CPU 上の開発環境とコンパイル時間の比較 (2) Pixel 3/UserLAnd
・ARM CPU の浮動小数点演算能力まとめ
・HTC 10 Snapdragon 820 Kyro の浮動小数点演算能力
・HTC 10 Snapdragon 820 Kyro の浮動小数点演算能力
・iPhone SE, Apple A9 の浮動小数点演算速度
・Raspberry Pi 3 の速度比較, Cortex-A53 の速度
・ARM Cortex-A53 の浮動小数点演算速度とコンパイル時間の比較
・iPod touch 6 の浮動小数点演算速度は Core 2 Duo ライン超え
・iPad Air 2 (Apple A8X) の浮動小数点演算能力
Device | Single thread | Multi thread | |||||
---|---|---|---|---|---|---|---|
SoC | CPU Core | big | little | big | little | Total | |
Snapdragon 845 | Kryo385 | 4+4 | 22.3 | 13.7 | 84.4 | 54.9 | 139.3 GFLOPS |
Exynos 7420 | A57+A53 | 4+4 | 16.8 | 11.8 | 55.5 | 47.1 | 102.6 GFLOPS |
Rockchip RK3399 | A72+A53 | 2+4 | 16.1 | 11.8 | 32.1 | 47.2 | 79.3 GFLOPS |
Snapdragon 808 | A57+A53 | 2+4 | 14.5 | 11.2 | 29.1 | 44.9 | 74.0 GFLOPS |
Snapdragon 821 | Kryo | 2+2 | 18.7 | 12.6 | 37.4 | 25.3 | 62.7 GFLOPS |
・big = big core, little = little core
・Total = Multi thread の合計
vfpbench の単精度の結果のみ抜き出しています。単位は GFLOPS 。数値が大きい方が高速です。
表の CPU は Kryo, Kryo 385 (A75), Cortex-A57 いずれも 64bit x2 pipe なので、ピーク性能の差は純粋に core 数と clock 数で決まっています。
同様に little core の Cortex-A53/A55 も 64bit x2 の FP pipe を持っているので、数値上はほぼクロック差だけの違いとなっています。32bit 時代の little core Cortex-A7 と比べると性能は大きく上がっています。
初代 Kryo は Qualcomm 独自 core ですが、Snapdragon 845 の Kyro 385 は ARM Cortex-A75 + A55 がベースになっているようです。そのため Snapdragon 845 Kryo 385 の特性は初代 Kryo は異なっています。
例えば Kyro と Kyo 385 は積和命令のピーク演算はどちらも同一ながら、加算だけなら Snapdragon 821 の Kryo の方が 2倍速く回っています。
下記の表は 1 cycle に実行できる命令数 (IPC)
Device | 64bit | 128bit | ||
---|---|---|---|---|
CPU Core | mul/fma | add | mul/fma | add |
Kryo (Snapdragon 821) | 2 | 4 | 1 | 2 |
Kryo 385 (A75/A55)/A72/A57/A53 | 2 | 2 | 1 | 1 |
Kryo 385 のもとになった Cortex-A75 は ARM の新しい命令セットに対応しています。
Kryo 385 (A75/A55) | ARMv8.2-A |
Cortex-A72/57/53 | ARMv8.0-A |
以前の fp16 (半精度浮動小数点) 対応は変換命令だけでした。ロードストアは fp16 でも演算は fp32 以上に変換してから行います。v8.2 対応の A75/A55 では Deep Learning 向けに 16bit 命令が強化されています。fp16 のまま直接演算できるようになりました。
・ARM FPU (VFP/NEON) の種類
例えば NEON (Advanced SIMD) では 128bit 時に 8並列で演算が行われます。単精度 32bit と比べると 2倍の速度が出るはずなので、余裕があったら試してみたいと思います。
テストに使った機種の詳細
Pixel 3 | Snapdragon 845 SDM845 | 4+4 | Kryo 385 (A75/A55) | 2.8GHz | 1.8GHz |
Galaxy S6 | Exynos 7420 | 4+4 | Cortex-A57/A53 | 2.1GHz | 1.5GHz |
C101PA | Rockchip RK3399 | 2+4 | Cortex-A72/A53 | 2.0GHz | 1.5GHz |
ZenfoneAR | Snapdragon 821 MSM8996 | 2+2 | Kryo | 2.3GHz | 2.1GHz |
Nexus 5X | Snapdragon 808 MSM8992 | 2+4 | Cortex-A57/A53 | 1.8GHz | 1.4GHz |
関連エントリ
・ARM CPU 上の開発環境とコンパイル時間の比較 (2) Pixel 3/UserLAnd
・ARM CPU の浮動小数点演算能力まとめ
・HTC 10 Snapdragon 820 Kyro の浮動小数点演算能力
・HTC 10 Snapdragon 820 Kyro の浮動小数点演算能力
・iPhone SE, Apple A9 の浮動小数点演算速度
・Raspberry Pi 3 の速度比較, Cortex-A53 の速度
・ARM Cortex-A53 の浮動小数点演算速度とコンパイル時間の比較
・iPod touch 6 の浮動小数点演算速度は Core 2 Duo ライン超え
・iPad Air 2 (Apple A8X) の浮動小数点演算能力
| 次のページ(日付が古い方向)>>