22 KYOTO UNIVERSITY 行列積の例 例:9x9 行列積(B = 3, M = 27) × = キャッシュ上のデータ ディスク上のデータ アクセスしたデータ HIT MISS HIT 右側の行列がめちゃくちゃ MISS する 解決策: 1. ループの順序交換(今回は省略) 2. 行列のブロック化
39 KYOTO UNIVERSITY 行列をブロックに区切り部分行列の積を計算する 例:9x9 行列積(B = 3, M = 27) with ブロック化 × = キャッシュ上のデータ ディスク上のデータ アクセスしたデータ HIT HIT HIT 小分けにしたことで作業中のデータが全てキャッシュに 収まるので、MISS がほぼない!
40 KYOTO UNIVERSITY ブロックのサイズを決めるのは難しい 問題点:行列ブロックのサイズをどう決めればよい? ある種のパラメータチューニング問題 理想的にはブロックの一辺は とするのが良い (作業サイズである がキャッシュサイズ M となるように) 理想のブロックサイズは M に依存するが M はコンピュータに依存する ライブラリの作者は R をハードコードすると、移植性が下がる R をプログラムの入力として受け取るようにすると、ユーザーは自分の コンピュータのキャッシュサイズを調べて使わなければいけなくなる……
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
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