Raspberry PiのGPUで数値計算: (1)QPUと数値計算
自己紹介
B1です.Idein Inc. ( http://idein.jp/ ) でアルバイトとして働いています.数値計算プログラムの最適化や並列化,組み込みプログラミングや電子回路設計の経験があり,弊社でそのような仕事をしています.上記に加えて画像処理やアルゴリズムに興味があります.
VideoCore IV QPU
Raspberry PiのSoCであるBCM2835(Raspberry Pi 1),BCM2836(Raspberry Pi 2)およびBCM2837(Raspberry Pi 3)には,VideoCore IVというGPUが載っています.これはRaspberry Piの起動やファームウェアの実行やメディア処理等を主に行っています.
VideoCore IVにはQPUというSIMDプロセッサがあります.これはOpen GL/ESのshading languageを実行するために存在します.といっても結構柔軟なプロセッサなので,加算や乗算やメモリI/O等の一般的な処理を行うことができます.理論性能は32-bit floatなら24Gflop/sと,結構速いです.
QPUの命令セットが2012年に公開されて以来,何人かの人がこのプロセッサを使って画像処理だけでなく数値計算をしてきました.例えば,elorimer氏のSHA256 ( https://github.com/elorimer/rpi-playground/tree/master/QPU/SHA-256 ) やAndrew Holme氏のFFT ( https://github.com/raspberrypi/firmware/tree/master/opt/vc/src/hello_pi/hello_fft ),Jetpac Inc.のsgemm ( https://github.com/jetpacapp/DeepBeliefSDK ),nineties氏のsgemm ( https://github.com/nineties/py-videocore ) です.
nineties氏のsgemm
nineties氏はQPUで数値計算をする例があまりにも少ないことや,あったとしても性能が低いことを憂いて,QPUのマルチコア・SIMD性を活かして高速なsgemmを書きました.詳しくは http://qiita.com/9_ties/items/15ab7fa198991a61a3a9 から始まる記事をご覧ください.
nineties氏のsgemmはアセンブラやドライバをPython内で完結させており,これを使えば簡単にQPUのプログラムを書いたり実行したりすることができます.
しかし,nineties氏のsgemmは,以下の点において不完全です.
Raspberry Pi 1以降ではうまく動作しない
Raspberry Pi 1,2,3での実行結果を https://github.com/Terminus-IMRC/py-videocore/blob/relative/outputs.md に置いておきます.
Raspberry Pi 1以降で実行すると,結果の誤差が大きくなります.また,相対誤差を見ると,Raspberry Pi 1でさえうまく動作していないように見受けられます.絶対誤差は1e-4ほどと小さいのですが,それは結果の値が小さいからであり,情報落ちが発生する浮動小数点数に対しては相対誤差を使用したほうが良いでしょう.
さらに,QPUのクロックがより速いはずのRaspberry Pi 3での実行時間が1,2のものよりも長く,正しく動作しているとは考えにくいです.
まだ最適化の余地がある
nineties氏のsgemmにはまだ最適化できそうな箇所があります.
ただし,nineties氏はアムダールの法則に従って,すなわちオーバーヘッドとなりそうなところだけチューニングしています.この精神は無駄な努力を省くためにとても重要です.自戒を込めて.
私は,以上の点を改善したsgemmを書こうと思いました.
http://qiita.com/Terminus-IMRC/items/c2b3ef492fe9c018d6ff に続きます.
License
Copyright © 2016 Sugizaki Yukimasa. All rights reserved.
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.