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. 2 KYOTO UNIVERSITY CO はキャッシュの構造を知らなくてもキャッシュ活用する  キャッシュオブリビアス (Cache Oblivious) アルゴリズムとは、キャッシュの

    構造を知らない状態で、キャッシュの恩恵を得るアルゴリズムのこと  好きな理由:  問題設定を聞いたときの、そんなことできるんだ感  パラメータを含まない万能手法が存在するという理論の綺麗さ  解法のアイデアのシンプルさ Matteo Frigo, Charles E. Leiserson, Harald Prokop, Sridhar Ramachandran. Cache-Oblivious Algorithms. FOCS 1999.
  2. 3 KYOTO UNIVERSITY メモリやディスクへのアクセスは圧倒的に遅い  キャッシュの常識 1: メモリやディスクへのアクセスはキャッシュへのアクセスよりも圧倒的に遅い  メモリ

    1 回アクセスするくらいならキャッシュに 30 回アクセスした方がマシ 多少演算が増えようが 1 回でもメモリアクセスを少なくした方がトク アクセス時間 SRAM(キャッシュ) 1ns DRAM(メモリ) 100ns 磁気ディスク(HDD) 10000000ns
  3. 7 KYOTO UNIVERSITY キャッシュにはブロック単位で読み込む この番地にアクセスしたいとき キャッシュ ディスク ブロック単位でキャッシュに読み込み  キャッシュの常識

    2: ディスクからの読み込みはブロック単位で行う ブロックのサイズ(ブロックに含まれるデータ数)を B キャッシュのサイズを M とする キャッシュ内のブロックの数は M/B 個
  4. 8 KYOTO UNIVERSITY 行列積の例  例:9x9 行列積(B = 3, M

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    = 27) with ブロック化 × = キャッシュ上のデータ ディスク上のデータ アクセスしたデータ HIT HIT HIT 小分けにしたことで作業中のデータが全てキャッシュに 収まるので、MISS がほぼない!
  36. 40 KYOTO UNIVERSITY ブロックのサイズを決めるのは難しい  問題点:行列ブロックのサイズをどう決めればよい? ある種のパラメータチューニング問題  理想的にはブロックの一辺は とするのが良い

    (作業サイズである がキャッシュサイズ M となるように)  理想のブロックサイズは M に依存するが M はコンピュータに依存する  ライブラリの作者は R をハードコードすると、移植性が下がる  R をプログラムの入力として受け取るようにすると、ユーザーは自分の コンピュータのキャッシュサイズを調べて使わなければいけなくなる……
  37. 41 KYOTO UNIVERSITY 階層構造のために、ブロックのサイズ決めはより困難に  より悪いお知らせ:キャッシュは階層構造をなしている  M と B

    はどこに合わせればよい?  どこに合わせるのが理想かは先験的には 分からない  どこがボトルネックになっているかは ユーザーがチューニングで発見するしかない  上の層がボトルネックなら領域は小さく 下の層がボトルネックなら領域は大きく取るべき クラウド(インターネット) ディスク メインメモリ L3 L2 L1
  38. 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
  39. 45 KYOTO UNIVERSITY キャッシュオブリビアスな行列積の例  例:行列積(行列サイズ n, B, M は不明)

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

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

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

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

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

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

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

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

    × = アルゴリズムは (Cache-conscious っぽくない)普通の分割統治 分割統治で書いたら勝手に cache-oblivious になっている
  48. 54 KYOTO UNIVERSITY 分割統治行列積は最適  Cache-Oblivious アルゴリズムのキャッシュミス回数が、 最適な Cache-Aware アルゴリズムのキャッシュミス回数の定数倍で

    抑えられるとき、その Cache-Oblivious アルゴリズムは最適という  前述の分割統治行列積は最適  行列積問題はここでゴール
  49. 55 KYOTO UNIVERSITY 集合を管理するデータ構造  次はもう少し解決が難しい問題を紹介  問題(集合を管理するデータ構造、あるいは探索木): 入力として整数集合 が与えられます。

    前処理にはいくら時間をかけてもよいです。 続いてクエリ が与えられます。 が集合中に含まれているかをできるだけ少ないキャッシュミスで判定し てください。  つまり、普通に集合を管理するデータ構造を作ってください。  更新は無いのでかなり簡単版
  50. 56 KYOTO UNIVERSITY 二分探索は最適ではない  分割統治すれば良い? → つまりは二分探索? → 実は二分探索は遅い

     二分探索のアルゴリズム: 前処理:集合の要素をソートする クエリ処理:属する可能性のある範囲を半分ずつに絞っていく  候補範囲が B より小さくなったら、あとは全てキャッシュ内で処理できる → キャッシュミス回数は Θ(log2 n - log2 B) 回 (大抵 n >> B なのでこれはだいたい log2 n 回)  これは最適ではない
  51. 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 倍速い
  52. 58 KYOTO UNIVERSITY Cache-Oblivious では分岐数の決定が難しい  この問題の難しさ: 分割統治の分岐を B を用いて決定したいが、

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

    Cache-Oblivious 設定では B が利用できない  分岐数 2 にすると最適でなくなってしまう……  もう一つの強力な道具 van Emde Boas 配置の登場 (これも実質分割統治)
  54. 61 KYOTO UNIVERSITY van Emde Boas 配置  集合を完全二分木で管理する 論理的なデータ構造上の分岐は

    2 であることに注意 完全二分木の模式図 この説明は https://www.slideshare.net/iwiwi/cacheoblivious-dsirnlp5 の表現をお借りしました。
  55. 66 KYOTO UNIVERSITY van Emde Boas 配置  この分割を再帰的に行う ...

    サイズ √n サイズ √n ... ディスク ... ... ごちゃごちゃするので省略 しているが、▲たちも ▲や▲で分割されている
  56. 69 KYOTO UNIVERSITY van Emde Boas 配置  どこかの再帰のタイミングで全部分木がキャッシュブロックに収まる どこで収まったかはプログラム自身は気づいていないが、とにかく収まる

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

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

    ... サイズ √n サイズ √n ... ディスク ... ... 1 ブロック (B) が このくらいなら ▲のサイズは √B 以上 B 以下 高さは Θ(log B) このノードにアクセスした瞬間▲が 1 miss で全て読み込まれる
  59. 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
  60. 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. 行列積のときは半々にしてたので問題サイズは最適の半分以上
  61. 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) さらに詳しく知りたい人へ
  62. 76 KYOTO UNIVERSITY  キャッシュオブリビアス (Cache Oblivious) アルゴリズムとは、キャッシュの 構造を知らない状態で、キャッシュの恩恵を得るアルゴリズムのこと 

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