Slide 1

Slide 1 text

1 KYOTO UNIVERSITY KYOTO UNIVERSITY キャッシュオブリビアスアルゴリズム Ryoma Sato

Slide 2

Slide 2 text

2 KYOTO UNIVERSITY CO はキャッシュの構造を知らなくてもキャッシュ活用する  キャッシュオブリビアス (Cache Oblivious) アルゴリズムとは、キャッシュの 構造を知らない状態で、キャッシュの恩恵を得るアルゴリズムのこと  好きな理由:  問題設定を聞いたときの、そんなことできるんだ感  パラメータを含まない万能手法が存在するという理論の綺麗さ  解法のアイデアのシンプルさ Matteo Frigo, Charles E. Leiserson, Harald Prokop, Sridhar Ramachandran. Cache-Oblivious Algorithms. FOCS 1999.

Slide 3

Slide 3 text

3 KYOTO UNIVERSITY メモリやディスクへのアクセスは圧倒的に遅い  キャッシュの常識 1: メモリやディスクへのアクセスはキャッシュへのアクセスよりも圧倒的に遅い  メモリ 1 回アクセスするくらいならキャッシュに 30 回アクセスした方がマシ 多少演算が増えようが 1 回でもメモリアクセスを少なくした方がトク アクセス時間 SRAM(キャッシュ) 1ns DRAM(メモリ) 100ns 磁気ディスク(HDD) 10000000ns

Slide 4

Slide 4 text

4 KYOTO UNIVERSITY キャッシュにはブロック単位で読み込む  キャッシュの常識 2: ディスクからの読み込みはブロック単位で行う この番地にアクセスしたいとき キャッシュ ディスク

Slide 5

Slide 5 text

5 KYOTO UNIVERSITY キャッシュにはブロック単位で読み込む  キャッシュの常識 2: ディスクからの読み込みはブロック単位で行う この番地にアクセスしたいとき キャッシュ ディスク キャッシュ内にデータがなければ

Slide 6

Slide 6 text

6 KYOTO UNIVERSITY キャッシュにはブロック単位で読み込む この番地にアクセスしたいとき キャッシュ ディスク ブロック単位でキャッシュに読み込み  キャッシュの常識 2: ディスクからの読み込みはブロック単位で行う

Slide 7

Slide 7 text

7 KYOTO UNIVERSITY キャッシュにはブロック単位で読み込む この番地にアクセスしたいとき キャッシュ ディスク ブロック単位でキャッシュに読み込み  キャッシュの常識 2: ディスクからの読み込みはブロック単位で行う ブロックのサイズ(ブロックに含まれるデータ数)を B キャッシュのサイズを M とする キャッシュ内のブロックの数は M/B 個

Slide 8

Slide 8 text

8 KYOTO UNIVERSITY 行列積の例  例:9x9 行列積(B = 3, M = 27) × = キャッシュ上のデータ ディスク上のデータ アクセスしたデータ

Slide 9

Slide 9 text

9 KYOTO UNIVERSITY 行列積の例  例:9x9 行列積(B = 3, M = 27) × = キャッシュ上のデータ ディスク上のデータ アクセスしたデータ MISS MISS MISS B = 3 要素ずつキャッシュに 読み込まれることに注意

Slide 10

Slide 10 text

10 KYOTO UNIVERSITY 行列積の例  例:9x9 行列積(B = 3, M = 27) × = キャッシュ上のデータ ディスク上のデータ アクセスしたデータ HIT HIT MISS

Slide 11

Slide 11 text

11 KYOTO UNIVERSITY 行列積の例  例:9x9 行列積(B = 3, M = 27) × = キャッシュ上のデータ ディスク上のデータ アクセスしたデータ HIT HIT MISS

Slide 12

Slide 12 text

12 KYOTO UNIVERSITY 行列積の例  例:9x9 行列積(B = 3, M = 27) × = キャッシュ上のデータ ディスク上のデータ アクセスしたデータ HIT MISS MISS

Slide 13

Slide 13 text

13 KYOTO UNIVERSITY 行列積の例  例:9x9 行列積(B = 3, M = 27) × = キャッシュ上のデータ ディスク上のデータ アクセスしたデータ HIT MISS HIT

Slide 14

Slide 14 text

14 KYOTO UNIVERSITY 行列積の例  例:9x9 行列積(B = 3, M = 27) × = キャッシュ上のデータ ディスク上のデータ アクセスしたデータ HIT MISS HIT

Slide 15

Slide 15 text

15 KYOTO UNIVERSITY 行列積の例  例:9x9 行列積(B = 3, M = 27) × = キャッシュ上のデータ ディスク上のデータ アクセスしたデータ HIT MISS MISS キャッシュがいっぱいに なったので排出

Slide 16

Slide 16 text

16 KYOTO UNIVERSITY 行列積の例  例:9x9 行列積(B = 3, M = 27) × = キャッシュ上のデータ ディスク上のデータ アクセスしたデータ HIT MISS HIT

Slide 17

Slide 17 text

17 KYOTO UNIVERSITY 行列積の例  例:9x9 行列積(B = 3, M = 27) × = キャッシュ上のデータ ディスク上のデータ アクセスしたデータ HIT MISS HIT

Slide 18

Slide 18 text

18 KYOTO UNIVERSITY 行列積の例  例:9x9 行列積(B = 3, M = 27) × = キャッシュ上のデータ ディスク上のデータ アクセスしたデータ HIT MISS HIT

Slide 19

Slide 19 text

19 KYOTO UNIVERSITY 行列積の例  例:9x9 行列積(B = 3, M = 27) × = キャッシュ上のデータ ディスク上のデータ アクセスしたデータ HIT MISS HIT

Slide 20

Slide 20 text

20 KYOTO UNIVERSITY 行列積の例  例:9x9 行列積(B = 3, M = 27) × = キャッシュ上のデータ ディスク上のデータ アクセスしたデータ HIT MISS HIT

Slide 21

Slide 21 text

21 KYOTO UNIVERSITY 行列積の例  例:9x9 行列積(B = 3, M = 27) × = キャッシュ上のデータ ディスク上のデータ アクセスしたデータ HIT MISS HIT

Slide 22

Slide 22 text

22 KYOTO UNIVERSITY 行列積の例  例:9x9 行列積(B = 3, M = 27) × = キャッシュ上のデータ ディスク上のデータ アクセスしたデータ HIT MISS HIT 右側の行列がめちゃくちゃ MISS する 解決策: 1. ループの順序交換(今回は省略) 2. 行列のブロック化

Slide 23

Slide 23 text

23 KYOTO UNIVERSITY 行列をブロックに区切り部分行列の積を計算する  例:9x9 行列積(B = 3, M = 27) with ブロック化 × = キャッシュ上のデータ ディスク上のデータ アクセスしたデータ

Slide 24

Slide 24 text

24 KYOTO UNIVERSITY 行列をブロックに区切り部分行列の積を計算する  例:9x9 行列積(B = 3, M = 27) with ブロック化 × = キャッシュ上のデータ ディスク上のデータ アクセスしたデータ MISS MISS MISS

Slide 25

Slide 25 text

25 KYOTO UNIVERSITY 行列をブロックに区切り部分行列の積を計算する  例:9x9 行列積(B = 3, M = 27) with ブロック化 × = キャッシュ上のデータ ディスク上のデータ アクセスしたデータ MISS HIT HIT

Slide 26

Slide 26 text

26 KYOTO UNIVERSITY 行列をブロックに区切り部分行列の積を計算する  例:9x9 行列積(B = 3, M = 27) with ブロック化 × = キャッシュ上のデータ ディスク上のデータ アクセスしたデータ MISS HIT HIT

Slide 27

Slide 27 text

27 KYOTO UNIVERSITY 行列をブロックに区切り部分行列の積を計算する  例:9x9 行列積(B = 3, M = 27) with ブロック化 × = キャッシュ上のデータ ディスク上のデータ アクセスしたデータ HIT HIT HIT

Slide 28

Slide 28 text

28 KYOTO UNIVERSITY 行列をブロックに区切り部分行列の積を計算する  例:9x9 行列積(B = 3, M = 27) with ブロック化 × = キャッシュ上のデータ ディスク上のデータ アクセスしたデータ HIT HIT HIT

Slide 29

Slide 29 text

29 KYOTO UNIVERSITY 行列をブロックに区切り部分行列の積を計算する  例:9x9 行列積(B = 3, M = 27) with ブロック化 × = キャッシュ上のデータ ディスク上のデータ アクセスしたデータ HIT HIT HIT

Slide 30

Slide 30 text

30 KYOTO UNIVERSITY 行列をブロックに区切り部分行列の積を計算する  例:9x9 行列積(B = 3, M = 27) with ブロック化 × = キャッシュ上のデータ ディスク上のデータ アクセスしたデータ HIT HIT HIT

Slide 31

Slide 31 text

31 KYOTO UNIVERSITY 行列をブロックに区切り部分行列の積を計算する  例:9x9 行列積(B = 3, M = 27) with ブロック化 × = キャッシュ上のデータ ディスク上のデータ アクセスしたデータ HIT HIT HIT

Slide 32

Slide 32 text

32 KYOTO UNIVERSITY 行列をブロックに区切り部分行列の積を計算する  例:9x9 行列積(B = 3, M = 27) with ブロック化 × = キャッシュ上のデータ ディスク上のデータ アクセスしたデータ HIT HIT HIT

Slide 33

Slide 33 text

33 KYOTO UNIVERSITY 行列をブロックに区切り部分行列の積を計算する  例:9x9 行列積(B = 3, M = 27) with ブロック化 × = キャッシュ上のデータ ディスク上のデータ アクセスしたデータ MISS MISS HIT

Slide 34

Slide 34 text

34 KYOTO UNIVERSITY 行列をブロックに区切り部分行列の積を計算する  例:9x9 行列積(B = 3, M = 27) with ブロック化 × = キャッシュ上のデータ ディスク上のデータ アクセスしたデータ HIT HIT HIT

Slide 35

Slide 35 text

35 KYOTO UNIVERSITY 行列をブロックに区切り部分行列の積を計算する  例:9x9 行列積(B = 3, M = 27) with ブロック化 × = キャッシュ上のデータ ディスク上のデータ アクセスしたデータ HIT HIT HIT

Slide 36

Slide 36 text

36 KYOTO UNIVERSITY 行列をブロックに区切り部分行列の積を計算する  例:9x9 行列積(B = 3, M = 27) with ブロック化 × = キャッシュ上のデータ ディスク上のデータ アクセスしたデータ HIT HIT HIT

Slide 37

Slide 37 text

37 KYOTO UNIVERSITY 行列をブロックに区切り部分行列の積を計算する  例:9x9 行列積(B = 3, M = 27) with ブロック化 × = キャッシュ上のデータ ディスク上のデータ アクセスしたデータ HIT HIT HIT

Slide 38

Slide 38 text

38 KYOTO UNIVERSITY 行列をブロックに区切り部分行列の積を計算する  例:9x9 行列積(B = 3, M = 27) with ブロック化 × = キャッシュ上のデータ ディスク上のデータ アクセスしたデータ HIT HIT HIT

Slide 39

Slide 39 text

39 KYOTO UNIVERSITY 行列をブロックに区切り部分行列の積を計算する  例:9x9 行列積(B = 3, M = 27) with ブロック化 × = キャッシュ上のデータ ディスク上のデータ アクセスしたデータ HIT HIT HIT 小分けにしたことで作業中のデータが全てキャッシュに 収まるので、MISS がほぼない!

Slide 40

Slide 40 text

40 KYOTO UNIVERSITY ブロックのサイズを決めるのは難しい  問題点:行列ブロックのサイズをどう決めればよい? ある種のパラメータチューニング問題  理想的にはブロックの一辺は とするのが良い (作業サイズである がキャッシュサイズ M となるように)  理想のブロックサイズは M に依存するが M はコンピュータに依存する  ライブラリの作者は R をハードコードすると、移植性が下がる  R をプログラムの入力として受け取るようにすると、ユーザーは自分の コンピュータのキャッシュサイズを調べて使わなければいけなくなる……

Slide 41

Slide 41 text

41 KYOTO UNIVERSITY 階層構造のために、ブロックのサイズ決めはより困難に  より悪いお知らせ:キャッシュは階層構造をなしている  M と B はどこに合わせればよい?  どこに合わせるのが理想かは先験的には 分からない  どこがボトルネックになっているかは ユーザーがチューニングで発見するしかない  上の層がボトルネックなら領域は小さく 下の層がボトルネックなら領域は大きく取るべき クラウド(インターネット) ディスク メインメモリ L3 L2 L1

Slide 42

Slide 42 text

42 KYOTO UNIVERSITY キャッシュオブリビアスアルゴリズム

Slide 43

Slide 43 text

43 KYOTO UNIVERSITY CO はキャッシュの構造を知らなくてもキャッシュ活用する  Cache-Conscious: キャッシュの存在を意識して設計する Cache-Aware(普通) キャッシュの構造を知った上で設計する 先程のブロックサイズ R を M に合わせる例 ↕ Cache-Oblivious(縛りプレイ) キャッシュの構造を知らずに設計する 知らないなりに頑張る B, M がどのような値でもいい感じになるように頑張る  Cache-Oblivious アルゴリズムができたら、そもそも B, M を使って いないので、どんなコンピュータでも、どのキャッシュ階層でも早くなる このページは https://www.slideshare.net/iwiwi/cacheoblivious-dsirnlp5 の表現をお借りしました。 One Fits All

Slide 44

Slide 44 text

44 KYOTO UNIVERSITY キャッシュオブリビアスな行列積の例  例:行列積(行列サイズ n, B, M は不明) × =

Slide 45

Slide 45 text

45 KYOTO UNIVERSITY キャッシュオブリビアスな行列積の例  例:行列積(行列サイズ n, B, M は不明) × = 基本アイデアは分割統治法 大抵の cache-oblivious アルゴリズムは分割統治法

Slide 46

Slide 46 text

46 KYOTO UNIVERSITY キャッシュオブリビアスな行列積の例  例:行列積(行列サイズ n, B, M は不明) × = 各行列を 2x2 の部分行列に分ける 各部分行列の積が分割統治の部分問題

Slide 47

Slide 47 text

47 KYOTO UNIVERSITY キャッシュオブリビアスな行列積の例  例:行列積(行列サイズ n, B, M は不明) × = それぞれの部分行列の積は再帰的に処理する つまりさらに 2x2 に区切って、2x2 に区切って、...とする 1x1 の行列積になれば普通に積を計算

Slide 48

Slide 48 text

48 KYOTO UNIVERSITY キャッシュオブリビアスな行列積の例  例:行列積(行列サイズ n, B, M は不明) × = ポイント:どこかの再帰のタイミングで全作業領域がキャッシュに収まる どこで収まったかはプログラム自身は気づいていないが、とにかく どこかの段階で収まることになる

Slide 49

Slide 49 text

49 KYOTO UNIVERSITY キャッシュオブリビアスな行列積の例  例:行列積(行列サイズ n, B, M は不明) × = ポイント:どこかの再帰のタイミングで全作業領域がキャッシュに収まる どこで収まったかはプログラム自身は気づいていないが、とにかく どこかの段階で収まることになる キャッシュの大きさが このくらいなら 再帰 4 段階目で

Slide 50

Slide 50 text

50 KYOTO UNIVERSITY キャッシュオブリビアスな行列積の例  例:行列積(行列サイズ n, B, M は不明) × = ポイント:どこかの再帰のタイミングで全作業領域がキャッシュに収まる どこで収まったかはプログラム自身は気づいていないが、とにかく どこかの段階で収まることになる キャッシュの大きさが このくらいなら 再帰 2 段階目で

Slide 51

Slide 51 text

51 KYOTO UNIVERSITY キャッシュオブリビアスな行列積の例  例:行列積(行列サイズ n, B, M は不明) × = 収まったときの問題サイズ R は を満たす サイズは半々になっていって、収まる直前では R > √M/3 なので

Slide 52

Slide 52 text

52 KYOTO UNIVERSITY キャッシュオブリビアスな行列積の例  例:行列積(行列サイズ n, B, M は不明) × = 収まったときの問題サイズ R は を満たす → M を知っていた場合と高々定数倍(1/2 倍)しか変わらない

Slide 53

Slide 53 text

53 KYOTO UNIVERSITY キャッシュオブリビアスな行列積の例  例:行列積(行列サイズ n, B, M は不明) × = アルゴリズムは (Cache-conscious っぽくない)普通の分割統治 分割統治で書いたら勝手に cache-oblivious になっている

Slide 54

Slide 54 text

54 KYOTO UNIVERSITY 分割統治行列積は最適  Cache-Oblivious アルゴリズムのキャッシュミス回数が、 最適な Cache-Aware アルゴリズムのキャッシュミス回数の定数倍で 抑えられるとき、その Cache-Oblivious アルゴリズムは最適という  前述の分割統治行列積は最適  行列積問題はここでゴール

Slide 55

Slide 55 text

55 KYOTO UNIVERSITY 集合を管理するデータ構造  次はもう少し解決が難しい問題を紹介  問題(集合を管理するデータ構造、あるいは探索木): 入力として整数集合 が与えられます。 前処理にはいくら時間をかけてもよいです。 続いてクエリ が与えられます。 が集合中に含まれているかをできるだけ少ないキャッシュミスで判定し てください。  つまり、普通に集合を管理するデータ構造を作ってください。  更新は無いのでかなり簡単版

Slide 56

Slide 56 text

56 KYOTO UNIVERSITY 二分探索は最適ではない  分割統治すれば良い? → つまりは二分探索? → 実は二分探索は遅い  二分探索のアルゴリズム: 前処理:集合の要素をソートする クエリ処理:属する可能性のある範囲を半分ずつに絞っていく  候補範囲が B より小さくなったら、あとは全てキャッシュ内で処理できる → キャッシュミス回数は Θ(log2 n - log2 B) 回 (大抵 n >> B なのでこれはだいたい log2 n 回)  これは最適ではない

Slide 57

Slide 57 text

57 KYOTO UNIVERSITY Cache-Aware な B-tree は log B 倍速い  Cache-Aware なら?  B-tree を使えばよい  B-tree は B 分岐の探索木 ここで B はキャッシュブロックサイズの B  観察 1: 大きさ O(B) の B-tree のノードが O(1) 回のキャッシュミスで読 み込める  観察 2: B-tree の深さは Θ(logB n)  よってキャッシュミス回数は Θ(logB n) = Θ(log n / log B) → Θ(log n) より log B 倍速い

Slide 58

Slide 58 text

58 KYOTO UNIVERSITY Cache-Oblivious では分岐数の決定が難しい  この問題の難しさ: 分割統治の分岐を B を用いて決定したいが、 Cache-Oblivious 設定では B が利用できない  分岐数 2 にすると最適でなくなってしまう……

Slide 59

Slide 59 text

59 KYOTO UNIVERSITY Cache-Oblivious では分岐数の決定が難しい  この問題の難しさ: 分割統治の分岐を B を用いて決定したいが、 Cache-Oblivious 設定では B が利用できない  分岐数 2 にすると最適でなくなってしまう……  もう一つの強力な道具 van Emde Boas 配置の登場 (これも実質分割統治)

Slide 60

Slide 60 text

60 KYOTO UNIVERSITY van Emde Boas 配置 (平方分割)

Slide 61

Slide 61 text

61 KYOTO UNIVERSITY van Emde Boas 配置  集合を完全二分木で管理する 論理的なデータ構造上の分岐は 2 であることに注意 完全二分木の模式図 この説明は https://www.slideshare.net/iwiwi/cacheoblivious-dsirnlp5 の表現をお借りしました。

Slide 62

Slide 62 text

62 KYOTO UNIVERSITY van Emde Boas 配置  完全二分木を高さ半分に分ける

Slide 63

Slide 63 text

63 KYOTO UNIVERSITY van Emde Boas 配置  完全二分木を高さ半分に分ける ここのレベルのノード数は 2log n / 2 = √n 個

Slide 64

Slide 64 text

64 KYOTO UNIVERSITY van Emde Boas 配置  完全二分木を高さ半分に分ける ... サイズ √n サイズ √n サイズ √n

Slide 65

Slide 65 text

65 KYOTO UNIVERSITY van Emde Boas 配置  それぞれの部分木ごとにディスク上に配置 ... サイズ √n サイズ √n サイズ √n ... ディスク

Slide 66

Slide 66 text

66 KYOTO UNIVERSITY van Emde Boas 配置  この分割を再帰的に行う ... サイズ √n サイズ √n ... ディスク ... ... ごちゃごちゃするので省略 しているが、▲たちも ▲や▲で分割されている

Slide 67

Slide 67 text

67 KYOTO UNIVERSITY van Emde Boas 配置  どこかの再帰のタイミングで全部分木がキャッシュブロックに収まる どこで収まったかはプログラム自身は気づいていないが、とにかく収まる ... サイズ √n サイズ √n ... ディスク ... ...

Slide 68

Slide 68 text

68 KYOTO UNIVERSITY van Emde Boas 配置  どこかの再帰のタイミングで全部分木がキャッシュブロックに収まる どこで収まったかはプログラム自身は気づいていないが、とにかく収まる ... サイズ √n サイズ √n ... ディスク ... ... 1 ブロック (B) が このくらいなら

Slide 69

Slide 69 text

69 KYOTO UNIVERSITY van Emde Boas 配置  どこかの再帰のタイミングで全部分木がキャッシュブロックに収まる どこで収まったかはプログラム自身は気づいていないが、とにかく収まる ... サイズ √n サイズ √n ... ディスク ... ... 1 ブロック (B) が このくらいなら このノードにアクセスした瞬間▲が 1 miss で全て読み込まれる

Slide 70

Slide 70 text

70 KYOTO UNIVERSITY van Emde Boas 配置  どこかの再帰のタイミングで全部分木がキャッシュブロックに収まる どこで収まったかはプログラム自身は気づいていないが、とにかく収まる ... サイズ √n サイズ √n ... ディスク ... ... 1 ブロック (B) が このくらいなら このノードにアクセスした瞬間▲が 1 miss で全て読み込まれる

Slide 71

Slide 71 text

71 KYOTO UNIVERSITY van Emde Boas 配置  どこかの再帰のタイミングで全部分木がキャッシュブロックに収まる どこで収まったかはプログラム自身は気づいていないが、とにかく収まる ... サイズ √n サイズ √n ... ディスク ... ... 1 ブロック (B) が このくらいなら ▲のサイズは √B 以上 B 以下 高さは Θ(log B) このノードにアクセスした瞬間▲が 1 miss で全て読み込まれる

Slide 72

Slide 72 text

72 KYOTO UNIVERSITY van Emde Boas 配置は最適  ●にアクセスするとき、訪れる▲の個数は log n / log B 個 → キャッシュミスは O(log n / log B) 回 → 最適! ... ディスク 1 ブロック (B) が このくらいなら ▲のサイズは √B 以上 B 以下 高さは Θ(log B) log n log B

Slide 73

Slide 73 text

73 KYOTO UNIVERSITY van Emde Boas はディスクを平方分割して解決  (復習)この問題の難しさ: 分割統治の分岐を B を用いて決定したいが、 Cache-Oblivious 設定では B が利用できない  van Emde Boas 配置では論理的なデータ構造は分岐数 2 を用いる (これで時間計算量は従来のデータ構造と同じになる)  一方、ディスクの配置の上では √n 分岐を行う これにより Cache-Oblivious 最適性を達成 なぜ? → log√B n = O(logB n) だから 大胆にサイズ減らすので問題サイズが √B まで小さくなりうるが log の底にかかる限り問題ない cf. 行列積のときは半々にしてたので問題サイズは最適の半分以上

Slide 74

Slide 74 text

74 KYOTO UNIVERSITY  Cache-Oblivious Algorithms. FOCS 1999 (Trans. Alg. 2012). 元論文。行列積・FFT・ソートなどこの時点で既に充実している。  Cache-Oblivious Algorithms. Master Thesis 1999. 考案者の一人 Harald Prokop の修士論文。 より豊富な問題と解説が載っている。  Cache-Oblivious Algorithms and Data Structures. BRICS 2002. Erik Demaine による Cache-Oblivious の解説。  6.851: Advanced Data Structures Erik Demaine の大学講義。L07-L09 が Cache-Oblivious について。 http://courses.csail.mit.edu/6.851/spring21/lectures/  アルゴリズムの解析ではマスター定理を多用するので、 馴染みのない人は先に勉強しておくことをおすすめします。 https://en.wikipedia.org/wiki/Master_theorem_(analysis_of_algorithms) さらに詳しく知りたい人へ

Slide 75

Slide 75 text

75 KYOTO UNIVERSITY まとめ

Slide 76

Slide 76 text

76 KYOTO UNIVERSITY  キャッシュオブリビアス (Cache Oblivious) アルゴリズムとは、キャッシュの 構造を知らない状態で、キャッシュの恩恵を得るアルゴリズムのこと  好きな理由:  問題設定を聞いたときの、そんなことできるんだ感  パラメータを含まない万能手法が存在するという理論の綺麗さ  解法のアイデアのシンプルさ(分割統治で常勝) CO はキャッシュの構造を知らなくてもキャッシュ活用する キャッシュ構造を知らなくてもキャッシュは最大限活用できる Take Home Message