月別アーカイブ: 2019年6月

Snapdragon 845 ARMv8.2A 半精度 fp16 演算命令を使ってみる / Deep Learning 命令

Snapdragon 845 の Kryo 385 (Cortex-A75) は ARMv8.2 の拡張命令である半精度浮動小数点演算に対応しています。半精度浮動小数点数は HDR テクスチャなど GPU ではおなじみで、符号 1bit 指数部 5bit 仮数部 10bit の合計 16bit で表現されます。

CPU でもこれまで単精度と半精度 (fp32 と fp16) の相互変換が可能でした。X86/X64 では F16C 命令 (vcvtph2ps/vcvtps2ph) がありますし、ARM では以前試したように Cortex-A9 以降で変換命令が追加されています。変換だけなのでメモリアクセスは速くなるものの演算速度は特に変わりません。

ARMv8.2 ではオプションの拡張命令 FPHP, SIMDHP が新設され、対応していれば 16bit 半精度のまま演算ができるようになりました。128bit の SIMD(NEON) なら同時に 8個の積和演算を行うので、ピークの演算速度は単精度の倍になる計算です。

fmla  v0.2d, v1.2d, v2.2d   ; 倍精度 64bit x2
fmla  v0.4s, v1.4s, v2.4s   ; 単精度 32bit x4
fmla  v0.8h, v1.8h, v2.8h   ; 半精度 16bit x8

新しい vfpbench で対応したので実際に計測してみたのがこちらです。8 core で 8 thread 並列時の値です。

half fp16 single fp32 double fp64
Snapdragon 845 ARMv8.2A 277.7 GFLOPS 138.4 GFLOPS 68.7 GFLOPS
Snapdragon 835 ARMv8.0A — GFLOPS 129.5 GFLOPS 67.3 GFLOPS

・GFLOPS の値が大きい方が高速

予想通りほぼ fp32 の倍の値になっています。なお big/little core を個別計測した結果の合計なので、全 core 同時に走らせた場合はもう少し数値は下がるものと思われます。big, little それぞれの値を表にすると下記の通り。

half fp16 singlel fp32 double fp64
little big little big little big
Snapdragon 845 (1.77GHz + 2.80GHz) 108.9 168.8 54.0 84.4 27.3 41.5
Snapdragon 835 (1.90GHz + 2.45GHz) 59.3 70.2 29.6 37.7

Cortex-A75 の FP/SIMD pipe は 2本ありますが、命令単位で調べると 64bit (4h) 時は IPC=2、128bit (8h) 時は IPC=1 なのでそれぞれの pipe は 64bit であることがわかります。

Deep Learning 用の命令としては他にも 8bit 積和演算である Dot Product (dotprod) 拡張命令があります。これも ARMv8.2A のオプションで、下記ような整数 Int8 の 4乗算と 4加算を 4並列で行うことができます。AVX512VNNI や GeForce RTX (Turing) などの Int8 命令によく似ています。

udot  v0.4s, v1.16b, v2.16b
sdot  v0.4s, v1.16b, v2.16b

32bit += 8bit * 8bit + 8bit * 8bit + 8bit * 8bit + 8bit * 8bit
32bit += 8bit * 8bit + 8bit * 8bit + 8bit * 8bit + 8bit * 8bit
32bit += 8bit * 8bit + 8bit * 8bit + 8bit * 8bit + 8bit * 8bit
32bit += 8bit * 8bit + 8bit * 8bit + 8bit * 8bit + 8bit * 8bit

fp16 の倍なので計算上は 500 GOPS を超えるのですが、残念ながら Snapdragon 845 の Kryo 385 では対応していませんでした。

詳細なログはこちら
Pixel 3 Snapdragon 845 Kryo 385 2.8GHz x4 + 1.77GHz x4 ARM64 (AArch64) Android 9.0

vfpbench のログ(一部)

ARCH: ARMv8.2A
FPU : ASIMD(AArch64 NEON) FPHP ASIMDHP
Name: Qualcomm Technologies, Inc SDM845

CPU Thread:  8
CPU Core  :  8
CPU Group :  2
  Group 0: Thread= 4  Clock=1.766400 GHz  (mask:f)
  Group 1: Thread= 4  Clock=2.803200 GHz  (mask:f0)
NEON  : yes
FMA   : yes
FPHP  : yes
SIMDHP: yes

Total:
SingleThread HP max:   71.675 GFLOPS
SingleThread SP max:   35.892 GFLOPS
SingleThread DP max:   17.940 GFLOPS
MultiThread  HP max:  277.711 GFLOPS
MultiThread  SP max:  138.445 GFLOPS
MultiThread  DP max:   68.745 GFLOPS

Group 0:  Thread=4  Clock=1.766400 GHz  (mask:f)
  SingleThread HP max:   27.426 GFLOPS
  SingleThread SP max:   13.683 GFLOPS
  SingleThread DP max:    6.851 GFLOPS
  MultiThread  HP max:  108.928 GFLOPS
  MultiThread  SP max:   54.046 GFLOPS
  MultiThread  DP max:   27.273 GFLOPS

Group 1:  Thread=4  Clock=2.803200 GHz  (mask:f0)
  SingleThread HP max:   44.248 GFLOPS
  SingleThread SP max:   22.209 GFLOPS
  SingleThread DP max:   11.090 GFLOPS
  MultiThread  HP max:  168.783 GFLOPS
  MultiThread  SP max:   84.400 GFLOPS
  MultiThread  DP max:   41.472 GFLOPS

関連ページ
VFP Benchmark Log 計測結果まとめ

関連エントリ
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 命令を使ってみる

Oculus Quest 5万円ちょうどで買えるフルスペック VR

Oculus Go が登場してからちょうど一年。新しい VR デバイス Oculus Quest が発売されました。最大の特徴はポジショントラッキングにフル対応したスタンドアロン型になっていることです。

要するに、これまで PS4 かデスクトップ PC でしか遊べなかった両手モーションコントローラやルームスケール対応ゲームが、部屋へのベースステーション設置作業とかケーブルの配線とか一切の準備不要で、完全ワイヤレスで楽しむことができるようになるわけです。

・ケーブルなし
・外部センサーやベースステーションの設置なし
・両手モーションコントローラでポジショントラッキング対応
・ルームスケール対応

例えると最初のマルチタッチ対応スマートフォンが出たようなもの。手軽に VR を楽しむために欲しかったものが一通り実現されたことになるので、後はスマートフォンのように年々プロセッサの性能を上げていけばいいだけです。

もちろんモバイルプラットフォームなので、ハイエンド PC と比べると CPU/GPU 性能には大きな隔たりがあります。特に描画性能は落ちるため、決して従来型のコンソールやデスクトップ向け VR HMD が不要になるわけではありません。またアーキテクチャも違うので、Steam などの既存のゲームがそのまま動くわけでもなく、対応ソフトの登場を待つ必要があります。

対応ソフトはまだまだ少ないですが、VR 機能が統一されたので Quest 向けゲームはだいぶ開発しやすくなります。今まではコントローラやトラッキングの仕様が違いすぎて、PC の本格的な VR ゲームをモバイルやスタンドアロン機へ移植するのが困難でした。

またケーブルやベースステーションがないことで、ルームスケール範囲の自由度はむしろ従来のデスクトップ型 VR よりも高くなります。

なお Oculus Quest と同等のデバイスとしては HTC Vive Focus Plus があります。Quest より値段は高いものの、こちらもスタンドアロンかつ両手のモーションコントローラ込みでポジショントラッキングに対応しています。Daydream も HMD のポジショントラッキングに対応した Mirage Solo が出ていますが、6DoF 対応のモーションコントローラがまだありません。ただし Daydream も 6DoF 対応コントローラの開発は行われているようです。

Google VR: Experimental Daydream 6DoF controllers

今後はモバイル系のスタンドアロン機も 6.6DoF 対応が標準になっていくものと思われます。

Oculus の場合アーキテクチャ面でのプラットフォームは2種類ですが、ソフトウエアの対応は Rift, Quest, Go それぞれ異なっています。Oculus Quest の OS やアーキテクチャはモバイル系に属しますが、トラッキング性能やコントローラは PC 系の Rift (S) と同じです。アーキテクチャ上は Quest でも Go/GearVR ソフトが動きそうですが、今のところは対応していないようです。

Oculus HMD Controller Host OS Arch
Oculus Rift / Rift S 6DoF 6DoF Touch x2 外部 PC Windows x64
Oculus Quest 6DoF 6DoF Tocuh x2 Standalone Android 7.1 arm64
Oculus Go (Gear VR) 3DoF 3DoF x1 Standalone Android 7.1 arm64

ちなみに Daydream と Vive の場合は下記の通り。

Daydream HMD Controller Host OS Arch
Daydream 3DoF 3DoF x1 Smartphone Android 7.1+ arm64
Daydream Standalone 6DoF 3DoF x1 Standalone Android 7.1+ arm64

HTC Vive HMD Controller Host OS Arch
HTC Vive/Pro/Eye 6DoF 6DoF x2 +α 外部 PC Windows 他 x64
HTC Cosmos 6DoF 6DoF x2 外部 PC? Windows 他? x64?
HTC Focus Plus 6DoF 6DoF x2 Standalone Android arm64
HTC Focus 6DoF 3DoF x1 Standalone Android arm64

より詳しいスペックはこちらに載せています。

HMD VR / AR Device spec 一覧

関連エントリ
Oculus Quest も文章書き&開発マシンにする
Android/Oculus Go/Daydream の画面をミラーリングするツールを作ってみた
Oculus Go で一般 Android アプリを起動できるランチャーを作ってみた
Oculus Go を文章書き&開発マシンにする
VR で物が大きく見えたり小さく見えたりするわけ
Oculus Go は VR ができる新しい携帯ゲーム機

VR Daydream 上で UserLAnd / Termux を使う

前回 Daydream 上でのテストに使用した方法です。通常のスマートフォンなら Oculus TV のような仕組みが不要なので、VR 上で動く VNC か SSH client があれば OK です。ブラウザ上で動く noVNC を使ってみました。

●noVNC での接続

事前に Bluetooth キーボードを接続しておくことをおすすめします。まずはスマートフォン単体で。

(1) UserLAnd の Install

(2) UserLAnd を立ち上げ、任意の Linux Distribution を選んで VNC を選択

(3) Termux の Install

(4) Termux に noVNC を入れて起動する

$ pkg install git
$ git clone https://github.com/novnc/noVNC.git
$ ./noVNC/utils/launch.sh --vnc localhost:5951

(5) Android の Chrome ブラウザから “http://localhost:6080/vnc.html” を開く

(6) noVNC の画面になるので “Connect” を押して VNC password を入れると Desktop が表示される。

(7) Menu の設定から Scaling Mode を “Local Scaling” に変更するとデスクトップ全体になります。

noVNC を開いたところ
noVNC

Android の Chrome 内で UserLAnd で Linux (Ubuntu)
UserLAnd で Linux Desktop

●VR 上での接続

Daydream View を使います。

(1) VR 上でライブラリのアプリ一覧から Chrome ブラウザを選びます。

(2) あとは同じように “http://localhost:6080/vnc.html” を開くだけです。

Daydream の Chrome でも UserLAnd で Linux (Ubuntu)
Daydream Chrome で UserLAnd の Linux Desktop

●速度面

前回 も載せましたが、さらに VR なしの noVNC のデータを追加しました。UserLAnd 上から Termux に ssh localhost -p 8022 で繋いでビルドを行っています。

VR あり VR利用 SoC RAM Thread Time
Daydream + Pixel 3 (noVNC) あり Snapdragon 845 4GB 8 72
Oculus Quest あり Snapdragon 835 4GB 8 105 秒
Oculus Go あり Snapdragon 821 3GB 4 275 秒
Daydream + ZenFone AR (noVNC) あり Snapdragon 821 8GB 4 349
VR なし VR利用 SoC RAM Thread Time
Pixel 3 (Termux Console) 無し Snapdragon 845 4GB 8 32
Pixel 3 (noVNC) 無し Snapdragon 845 4GB 8 38
Essential Phone 無し Snapdragon 835 4GB 8 38 秒
ZenFone 3 Max ZC553KL 無し Snapdragon 430 3GB 8 100 秒
ZenFone AR (Termux Console) 無し Snapdragon 821 8GB 4 111
ZenFone AR (noVNC) 無し Snapdragon 821 8GB 4 135
Nexus 5X 無し Snapdragon 808 2GB 6 135 秒

・Time はビルドにかかった時間で単位は秒。Time の値が小さい方が高速。

●画面など

デスクトップウィンドウのような細かい文字だと Pixel 3 の解像度 (2180×1080) ではかなり厳しいことがわかりました。携帯できる大画面モニタとして使えると便利かと思いましたが、全体的にぼやけており逆に画面が狭くなったように感じます。

ZenFone AR は解像度 (2560×1440) が高い反面、ビルドのような高負荷な状態が続くと処理落ちが発生します。リプロジェクションも追従できなくなっており、酔いやすいので注意です。

どちらもレンズの端に歪みが生じていたり、何らかのタイミングで 2D アプリのウィンドウが表示されたりと専用機と比べるとどうしてもあらが目立つ印象です。今回テストした範囲では UserLAnd/termux で VR を使うメリットはありませんでした。Pixel 3 XL や Galaxy S9、Mirage Solo ではまた違った結果になるかもしれません。

関連ページ
Android の上の開発環境
HMD VR / AR Device spec 一覧

関連エントリ
Oculus Quest も文章書き&開発マシンにする
Android UserLAnd の更新と VNC 画面設定
UserLAnd : Android 9.0 で Ctrl + SPACE を使えるようにする
Android Termux で日本語入力を行う / UserLAnd との併用
Android 9.0 と Bluetooth Keyboard による日本語入力
Android/Oculus Go/Daydream の画面をミラーリングするツールを作ってみた
Oculus Go で一般 Android アプリを起動できるランチャーを作ってみた
Oculus Go を文章書き&開発マシンにする
UserLAnd とブラウザ
Android 上の開発環境と UserLAnd
OS の中の Linux (WSL/Chrome OS/Android UserLAnd)
ARM CPU 上の開発環境とコンパイル時間の比較 (2) Pixel 3/UserLAnd
Oculus Go は VR ができる新しい携帯ゲーム機

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

Oculus Go に続いて上位機種 Oculus Quest が登場しました。両手のモーションコントローラ含めてポジショントラッキングに対応しており、スタンドアロンながら 6.6DoF のフルスペック VR になっています。

Oculus Quest にも Oculus TV が入っており、以前作成した TVLauncherGo がそのまま使えるようです。Oculus Go と同じように Oculus TV 上で Android アプリが動きました。

・設定アイコンから Bluetooth Keyboard の接続
・同じく設定から物理キーボードのキーレイアウト変更
・UserLAnd を使って Linux をインストール
・VNC アプリの起動 (制限あり)

などなど一通りうまくいっています。UserLAnd が動けば、開発環境や日本語入力環境の構築ができます。

つまり Oculus Quest と Bluetooth Keyboard を持ち歩けばどこでも大画面で作業に没頭できるようになるわけです。

Oculus Quest + UserLAnd + Ubuntu + bVNC

ちなみに開発環境には Termux も併用しています。Termux 自体は TVLauncherGo がなくても動きます。(併用する理由はこちら)

● Oculus Quest の速度

Oculus Go よりも性能が上がってだいぶ快適になりました。下記の表は Termux 上でのコンパイル速度の比較です。Quest は Go よりも 2.6 倍速くなっています。

VR あり VR利用 SoC RAM Thread Time
Daydream + Pixel 3 あり Snapdragon 845 4GB 8 72
Oculus Quest あり Snapdragon 835 4GB 8 105
Oculus Go あり Snapdragon 821 3GB 4 275
Daydream + ZenFone AR あり Snapdragon 821 8GB 4 349
VR なし VR利用 SoC RAM Thread Time
Pixel 3 無し Snapdragon 845 4GB 8 32
Essential Phone 無し Snapdragon 835 4GB 8 38
ZenFone 3 Max ZC553KL 無し Snapdragon 430 3GB 8 100
ZenFone AR ZS571KL 無し Snapdragon 821 8GB 4 111
Nexus 5X 無し Snapdragon 808 2GB 6 135

・Time の単位は秒。値が小さい方が高速。

当然ながら VR を使わない状態だともっと高速です。同じ SoC を搭載した機種同士で比べると、VR 空間上でのコンパイルは通常の状態より 2.5 倍前後遅くなっています。それだけ VR の描画は負荷が高いわけです。

Quest の結果は VR 無しの ZenFone AR (Snapdragon 821) や ZenFone 3 Max (Snapdragon 430) とほぼ同じくらいになっています。VR 上で素の Snapdragon 821 や Snapdragon 430 が動いていると思えば速度のイメージが掴めるのではないでしょうか。

比較用に Daydream も試しましたが、Snapdragon 845 の Pixel 3 は速いものの画面解像度が低く実用には厳しいものがありました。XL ならちょうど良いのかもしれません。Zenfone AR はビルド中、発熱のためか処理落ちが多く不安定でした。やはり専用機である Oculus Go や Quest は解像度が高く画面端の歪みもなく安定しています。

●持ち歩きやすさ

可搬性に関しては Go の方が上です。性能が上がりサイズと重量が若干増えたのもありますが、バンドがしっかりした作りになったため Go のように折り畳めなくなっています。また場所が変わると毎回ガーディアン設定が出てくるので、使うまでにひと手間かかります。

Oculus Go と Oculus Quest

●ポジショントラッキング

ポジショントラッキングのおかげで VR 内での見え方はかなり自然になりました。スクリーンに近づいたり離れたりできるので、文字が小さくて見えにくい場合も近寄れば読むことができます。ただしガーディアン範囲を抜けると外部カメラ映像に切り替わってしまうので、大きく動く場合はルームスケールの範囲設定が必要。

●環境設定など

Go とはコントローラが違いますが使うボタンは限られています。Oculus TV で前の画面に戻るには (B) ボタンを使います。

Oculus TV で前の画面に戻る操作
・Oculus Go : メニューボタン
・Oculus Quest : 右コントローラの (B) ボタン

(1) TVLauncherGo の apk を install

(2) Oculus TV → TVLauncherGo → 設定アイコン → Bluetooth
 ・ Bluetooth キーボードを接続
 ・ 必要に応じてレイアウト選択
  ・ 設定の言語→キーボードレイアウト
  ・ (「106/109106/109ハードウェアキーボード配列変更 (+親指Ctrl) [日本語配列]」が使えます。

(3) UserLAnd の apk を install

(3) Oculus TV → TVLauncherGo → UserLAnd
 ・Linux install (SSH を選択)

下記の記事も参考にしてください。
Oculus Go を文章書き&開発マシンにする
Oculus Go で一般 Android アプリを起動できるランチャーを作ってみた

● VNC を使う場合

UserLAnd が bVNC Free 以外の client にも対応したため手順が若干変わりました。Real VNC Viewer を使う場合でも UserLAnd が直接呼び出してしまうため、一旦停止させてから Oculus TV 経由で起動する必要があります。そのかわり複数の VNC client を入れることで起動をキャンセルできます。

以下は「環境設定など」の続きです。

(1) Real VNC Viewer の apk を install

(2) Oculus TV → TVLauncherGo → UserLAnd
 ・ Linux Distribution 名長押しで VNC に変更

(3) Linux を起動すると画面真っ黒でロード待ちになるので、右コントローラの Oculus Button で戻る
 ・Real VNC Viewer は大丈夫ですが、bVNC だとここで戻れないので再起動になります。

(4) 右コントローラの (B) ボタンで TVLauncerGo に戻り強制停止する
 ・VNC Viewer アイコン長押しで「アプリ情報」の画面を開く (設定→アプリ→VNC Viewer でも構わない)
 ・VNC Viewer アプリを強制停止する (起動した状態を一旦クリアするため)

(5) TVLauncerGo に戻る

(6) あらためて VNC Viewer を起動し、下記の設定で接続する
  ・ HOST: 127.0.0.1
  ・ PORT: 5951

(7) VNC 接続時にパスワードを聞かれるので、UserLAnd の Linux アカウント作成時に設定した VNC Password を入れる

最初は画面が Native 解像度になっているので ~/.vncrc を書き換えて調節してください。1280×720 推奨。

UserLAnd の日本語環境設定についてはこちらを参考にしてください。

なお Real VNC Viewer は比較的安全に起動できますが、モーションコントローラでのマウス操作には難があります。ウィンドウなどドラッグ移動できないのと、ちょっとしたブレでタスクバーのメニューが開かないなど制限があります。少々手間がかかりますが bVNC を使う方法があります。

● VNC を使う場合 (bVNC)

UserLAnd からの呼び出しをキャンセルするために、Real VNC Viewer と bVNC の両方を install しておく必要があります。必ず Bluetooth Keyboard を接続しておいてください。

(1) Real VNC Viewer の apk を install

(2) bVNC の apk を install

(3) Oculus TV → TVLauncherGo → UserLAnd
 ・ Linux Distribution 名長押しで VNC に変更

(4) Linux を起動すると VNC client 選択画面になるので、Bluetooth Keyboard の [ESC] を押してキャンセル

(5) 右コントローラの (B) ボタンで TVLauncerGo に戻る

(6) TVLauncerGo から bVNC を起動

(7) 下記の設定で接続する。右上の [CONNECT] を押す
  ・ HOST: 127.0.0.1
  ・ PORT: 5951
  ・ Linux アカウント作成時に入力したユーザー名とパスワード

(8) つながったら bVNC の設定メニューから 「Input Mode」 → 「Direct, Hold Pan」 を選択する

これでモーションコントローラだけでウィンドウ操作もできるようになります。タスクバーのメニューも簡単に開きます。

Oculus TV を経由せずに UserLAnd が直接 bVNC を起動してしまうと操作できなくなるので注意してください。

関連ページ
Android の上の開発環境
HMD VR / AR Device spec 一覧

関連エントリ
Android UserLAnd の更新と VNC 画面設定
UserLAnd : Android 9.0 で Ctrl + SPACE を使えるようにする
Android Termux で日本語入力を行う / UserLAnd との併用
Android 9.0 と Bluetooth Keyboard による日本語入力
Android/Oculus Go/Daydream の画面をミラーリングするツールを作ってみた
Oculus Go で一般 Android アプリを起動できるランチャーを作ってみた
Oculus Go を文章書き&開発マシンにする
UserLAnd とブラウザ
Android 上の開発環境と UserLAnd
OS の中の Linux (WSL/Chrome OS/Android UserLAnd)
ARM CPU 上の開発環境とコンパイル時間の比較 (2) Pixel 3/UserLAnd
Oculus Go は VR ができる新しい携帯ゲーム機