Qualcomm Hexagon

TensorFlow に固定小数点演算を実装していた人による What I’ve learned about neural network quantization という記事を読んでいたら、Snapdragon 向けにもそういう最適化をしたと書いてある。Snapdragon に載っている Hexagon なる DSP を使うらしい。調べるとなかなか歴史のある DSP で、TensorFlow 対応は Qualcomm が今年はじめに発表をしていた。速そう。

TF のコードを覗くも肝心なところは Hexagon SDK の中に隠れているらしく、つなぎのコードだけがコミットされている。そして TF 力がないのでどういうアーキテクチャなのかわからない・・・。

Hexagon 自体の概要は Qualcomm のスライドがよくまとまっている。省電力でアプリケーション固有命令をおおく備えた SIMD で VLIW の CPU ということらしい。と、これだけ読むと DSP ってそういうものでは・・・と思ってしまうけれど、汎用 CPU としても使えるくらいにはリッチでもある。メモリ保護とかもあって一応 Linux を動かした実績があるという。ということは何らかのコンパイラがあるということで、実際 LLVM のターゲットがあった

VLIW ということで 4 命令までは pack して同時実行できる。SIMD として 64bit までの並列演算ができる。(8-bit 8 要素とか) そして 500MHz 動作かつ 4 thread までうごかせる。というかんじらしい。命令も fuse した命令が色々入っており、スループットは高いと主張している。リファレンスをダウンロードしてみると、その他に H.264 用の命令とかもあることがわかる。専用命令は Instrinsics を使うとしても VLIW とかどうすればコンパイラに指示できるのだろうか・・・。(そして リンク先の instrinsics の定義では H.264 用とされる decbin 命令がコメントアウトされているが大丈夫なのだろうか・・・)


それにしても自分はすごく初歩的なことがわかってない。実際の Android デバイスの DSP ではどんな OS が動いており、どのくらいのメモリが DSP に割り当てられ(そのメモリはホスト OS と共有するのか?)、どんなタイミングでコードが DSP のメモリにロードされ、実行され、ホスト側の CPU と DSP はどうやって通信するのか?だいたい GPU みたいなもだと考えればいいのかなあ。そういえば GPU と違って ISA が公開されているのは好感が持てるね。

GPGPU

GPU といえば Snapdragon の GPU は GPGPU できるのだろうかとふと調べてみたら OpenCL に対応していた。実際に使っている話を聞いたことがないが。

そして Snapdragon のライバル Exynos は DSP とかどうなってんのかなーと資料を探すも全然見当たらない。動画や音声のために色々 DSP は入ってるはずだが、Snapdragon と違ってサードパーティに公開はしていないのだろう。つまんね。ただし GPGPU は ARM のサイトに Mali SDKs というのがあって、それが使えるっぽい。めんどくさいから誰か Samsung と Qualcomm の両方に対応した Java の OpenCL ラッパー作ってくれないかなあ。そのくらい敷居が下がればやる気も起きるというものです。というか NDK に入れといて欲しい・・・


追記

その後もう少しだけ調べた。このスライドが色々謎に答えてくれたのと、SDK をダウンロードしてみたりもした。自分の疑問への答えを記録しておく。まず OS は QuRT という RTOS. 公開資料は見当たらない、つまり大したものではない。SDK が提供するプログラミングスタイルは、その QuRT に ELF の SO をロードさせ、ホスト側から SO 内の関数を RPC で呼び出すというもの。Hexagon  SDK に IDL コンパイラがついてくる。RPC の実態は ION と呼ばれる Android/Linux 提供の共有メモリというか DMA 機構らしい。

より重要な事実: Hexagon で実行するバイナリは OEM による署名が必要。つまりサードパーティのコードは動かせない!まじかよ!いみねーーー!そんなら GPU の方がいいわ・・・。TensorFlow が Hexagon 対応したといってもそこらへんのアプリが恩恵を受けられるわけではないのだなあ。がっかり。もちろん将来のバージョンの Android が Hexagon TensorFlow を同梱してくれればいいと言えなくもないけれど、そんなことが起こるのかわからないしどのみちバグがあっても直らない謎のバイナリに依存するのは OS の API だけでたくさん。はーがっかり。


追記

Android 8.1 に NN API が入ったので、こいつが裏で Hexagon を使ってくれれば良いのであろう。使ってるのか知らんけど。