Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

joisino
June 01, 2023

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

キャッシュオブリビアスアルゴリズムについての簡単な解説です。

https://www.slideshare.net/iwiwi/cacheoblivious-dsirnlp5https://erikdemaine.org/papers/BRICS2002/paper.pdf を参考にさせていただきました。

joisino

June 01, 2023
Tweet

More Decks by joisino

Other Decks in Science

Transcript

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  43. 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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  57. 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 倍速い

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  72. 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

    View full-size slide

  73. 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. 行列積のときは半々にしてたので問題サイズは最適の半分以上

    View full-size slide

  74. 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)
    さらに詳しく知りたい人へ

    View full-size slide

  75. 75 KYOTO UNIVERSITY
    まとめ

    View full-size slide

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

    View full-size slide