jubatusによるアセンブリ実行速度の自動チューニング
DESCRIPTION
Jubatusの回帰分析を使って、 アセンブリプログラムのエミュレートされた実行速度を自動チューニングしてみました。TRANSCRIPT
jubatusによるアセンブリ実行速度の自動チューニング
@nushio & @kumagi
#jubatus_hackathon http://connpass.com/event/8233/
mission:スーパーコンピュータで走る
プログラムを自動的に早くする。
その1:融合加乗算 (fmadd)を使う1クロックあたり 2演算!
fmadd
a b c
a*b+c
fmadd
←クロック
add
mul
fmadd
add
mul
fmadd
add
mul
fmadd
add
mul
fmadd
add
mul
fmadd
fmadd
その2:命令を一杯詰め込む
before after
各命令にはレイテンシがあるため、毎クロック演算機を無駄なく使うためには、依存関係のない演算を次々に投入せねばならない。
その3:キャッシュを使う演算機
キャッシュ
メモリ
• 主メモリは大容量だが、アクセスに時間がかかる。
• 比較的小さなキャッシュに頻繁に使うデータは置き、なるべくキャッシュミスせずに使いまわす必要がある。
チューニング対象:各命令について・・・
•命令実行の優先度?•キャッシュに残す優先度?
fmadd
add fmadd
CPUエミュレータ
実行結果:
49881 クロックです
• 優先度 0.11• 優先度 0.30• 優先度 0.97• 優先度 0.79• 優先度 0.56• 優先度 0.25• 優先度 0.84• 優先度 0.23• ・・・
1万行くらいのアセンブリ
• アセンブリの各行に対し命令実行の優先度と、キャッシュに残す優先度を指定すると、実行過程をシミュレートし、所要時間を見積もってくれるエミュレータを作った。
CPUエミュレータ
クロック数(成績)
• 優先度• 優先度• 優先度• 優先度• 優先度• 優先度• 優先度• 優先度• ・・・
Regression
• ランダムに生成した優先度リストとクロック数の組が沢山あれば、・・・
• Jubatusにより未知の優先度リストに対してもクロック数が推定できる!
CPUエミュレータ
クロック数(成績)
• 優先度• 優先度• 優先度• 優先度• 優先度• 優先度• 優先度• 優先度• ・・・
Regression
でも・・・
本当にやりたいのはこっち。(良いクロック数を出すプログラムを探
す)逆問題?難しい?
CPUエミュレータ
クロック数(成績)
• 優先度• 優先度• 優先度• 優先度• 優先度• 優先度• 優先度• 優先度• ・・・
Regression
×重み×重み×重み×重み×重み×重み・・・・
Jubatusの線形回帰分析機は、入力ベクトルと内部の重みの内積で出力を推定している。
重みが大きい成分ほど、クロックを大きくするのに貢献している(悪影響)。
内部状態はjubadumpツールで覗けます!
CPUエミュレータ
クロック数(成績)
• 優先度• 優先度• 優先度• 優先度• 優先度• 優先度• 優先度• 優先度• ・・・
Regression
×重み×重み×重み×重み×重み×重み・・・・
× 1=‐
• 優先度• 優先度• 優先度• 優先度• 優先度• 優先度• 優先度• 優先度• ・・・
重みに -1を掛け算。若干の正規化を施したのち優先度として採用!
CPUエミュレータ
クロック数(成績)
• 優先度• 優先度• 優先度• 優先度• 優先度• 優先度• 優先度• 優先度• ・・・
Regression
×重み×重み×重み×重み×重み×重み・・・・
×-1=
• 優先度• 優先度• 優先度• 優先度• 優先度• 優先度• 優先度• 優先度• ・・・
プログラム生成
追加まさにオンライン学習!
(&正規化 )
ランダム生成と対決!Random Jubatus
(最速)クロック数
70000~26919
35000~27768
テスト回数
5000 50
コア数 64コア 1コア所要時間 3時間くら
い1時間くらい
実行完了までのクロック数
(←小さいほど良い)
生成したプログラムの数
Random
Jubatus
Jubatusmakes it faster,
faster!
Jubatusの手軽さはやっぱり凄かった!皆様ありがとうございました!
Jubatusなら素早く、速くなる!