Upload
kumazaki-hiroki
View
3.256
Download
1
Embed Size (px)
Citation preview
Cache Obliviousの話@kumagi
科学と工学?• どう違うの?• ある工学者は言った。 「 3以上の奇数は素数」– 3,5,7が素数– 9は誤差– 11,13と素数だから 5/6 87%≒ の精度で正しい!
これはひどい
特に• コンピュータの上は科学だよ派–世界は数学に身を任せればだいたい上手くいくよ
• コンピュータの上は工学だよ派–世界は人力と経済と物理の果ての妥協だよ
個人的な好み→工学• 「コンピュータ工学の世界に難問は2つしかない。キャッシュの揮発と、変数の命名だ」–「珠玉のプログラミング」で読んだ–すごく工学っぽくて好きな言葉
• 逆に科学の人たち無限サイズの L1キャッシュを想定し過ぎ–それで生み出される「計算量的には速いけど実測は遅いアルゴリズム達」
計算量ェ…• 計算量の議論は「無限の大きさを扱う場合」を仮定している
Sorry!• 1000京円つぎ込もうが!• 100PBぐらいの大きさで!• 3Ghzぐらいの速度で!• 1クロックで動く L1キャッシュは作れない!
うちゅうのほうそくがみだれない!• いかにプロセスが微細化して CPUが高性能化しても CPUを流れる信号の速度は限界がある• 100年後のコンピュータであってもキャッシュの階層構造からは逃れられない!
結果として• 無限のデータを相手にするプログラムは絶対キャッシュミスする–そしてプリフェッチが間に合わない時にキャッシュミスが全体を律速する–時間計算量だけを相手にしてる場合じゃない!–理論値と実測値の差を埋めるには?
キャッシュ構造をアルゴリズムに埋め込む• キャッシュへのアクセスを細かくチューニングしたアルゴリズムを適宜作ればいいのでは?
• キャッシュ階層は今後も変わり続けるから延々と追従していくつもり?
ケーススタディ• 長ーい配列から
• (A*A)+(A*B)+(A*C)+(A*D)…..+ +(B*A)+(B*B)+(B*C)+(B*D)…..+ +(C*A)+(C*B)+(C*C)+(C*D)….という値を並列化して高速に求めたいとする。
A B C D E F G H I J K L M N O P Q
ケーススタディ• まとめるとこんな感じに計算していくのが普通
A B C D E F G H I J K L M N O P Q
A*(A+B+C+D+E+F+G+H+I….)
B C D E F G H I J K L M N O P QA
B*(A+B+C+D+E+F+G+H+I….)
C D E F G H I J K L M N O P QBA
C*(A+B+C+D+E+F+G+H+I….)
+
+
ケーススタディ• 並列化すればいい
A B C D E F G H I J K L M N O P Q
A*(A+B+C+D+E+F+G+H+I….)
B C D E F G H I J K L M N O P QA
B*(A+B+C+D+E+F+G+H+I….)
+
+C D E F G H I J K L M N O P QBA
C*(A+B+C+D+E+F+G+H+I….)
CPU1
CPU2
CPU3
結果• 縦軸が時間(下ほど速い)、横軸がコア数• 赤線が理論速度、青線が実測
Fast
Core
遅い!
そこで Cache Oblivious!• Oblivious = ぼんやりとした• キャッシュの階層構造を想定しながらも、その具体的なサイズや遅延時間は仮定しないアルゴリズム設計技法• 個人的に注目しているホットな分野• 再帰的に分割統治するアルゴリズムが多い
Cache Oblivious
• キャッシュ階層を簡略化してモデル化する–ライトバック・ライトスルーは気にしない–フルセットアソシアティブを仮定–サイズや転送速度や階層数に仮定を置かない• CPUに近いほど高速で小型になる
–むしろ HDDすらも磁気テープや S3に対するキャッシュとして考える
Cache Oblivious
• モデル図はこんな感じ
Cache Oblivious
• キャッシュに収まるよう問題を切り分ける
どうなるの?A B C D E F G H I J K L M N O P QA
BC
DE
FG
HI
JK
L
Task
どうなるの?A B C D E F G H I J K L M N O P QA
BC
DE
FG
HI
JK
L
1/4Task 1/4Task
1/4Task 1/4Task分割!
どうなるの?A B C D E F G H I J K L M N O P QA
BC
DE
FG
HI
JK
L
1/16Task 1/4Task
1/4Task 1/4Task
1/16Task
1/16Task
1/16Task
分割!
どうなるの?A B C D E F G H I J K L M N O P QA
BC
DE
FG
HI
JK
L
1/64Task
1/4Task
1/4Task 1/4Task
1/16Task
1/16Task
1/16Task
1/64Task
1/64Task
1/64Task
分割!
充分切り分けたら足していく• AA+AB+BA+BB
A BAB 1/64
Task
• AC+AD+DA+DBC DA
B 1/64Task
• CA+CB+DA+DBA BC
D 1/64Task
• CC+CD+DC+DDC DC
D 1/64Task
+ +
+
結果• 緑が理論値、黄色が実測値
Fast
Core
すごい!!
どこに感動したのか• これまで工学分野で相手にしてきた問題である「キャッシュ構造への最適化」
• モデル化して「科学の問題」に変えた• 数式が現れてなんか怖くなったけど
他にも• Cache Obliviousな– Sort–行列転置–行列積– 2分木( van Emde Boas)– B木–グラフ–線形リスト–まだまだ調べ中
Cache Oblivious on Hadoop
• 巨大なクラスタ環境では各マシンのメモリや CPUが揃っていない事の方が普通–つまり Cache Awareなアルゴリズムを組み上げるコストが高い–これは Cache Obliviousの時代が来るのでは? (個人の感想であり効果・効能を約束する物ではありません)