キャッシュとは
- メインメモリとCPUとの間にある中間的な記憶装置
- メインメモリより高速だが小容量
- 直近に必要となるデータを格納することでメインメモリの遅さをカバーする
- 複数のレベルで構成され得る
- L1は最速最小容量、L2はL1より低速だが大容量、L3はL2より(以下略
- CPUコアごとに独立のキャッシュメモリを持ち得る
キャッシュライン
- キャッシュ上で取り扱われるデータの最小単位
- 一定のアライメントで管理される
- 近年では共通して64バイトをひと単位とする
False Sharing
- データをプログラム上で共有していないのにキャッシュ上で共有されてしまう現象
- 同一のキャッシュラインを別々のコアで持つと、書き換え内容を同期させるためにパフォーマンスが低下し得る
キャッシュフレンドリーなコードとは
- 連続するメモリにオブジェクトを格納する
- あらゆるコンテナをvectorで実装できないか検討する
- 同一キャッシュラインにできるだけ多くのデータを乗せるようにする
- オブジェクトサイズを小さくする
- ポインタ参照を排除する
- アクセスパターンに応じてデータをまとめる
- SoAなデータ構造を使う
- プログラムもキャッシュに乗るので、同様の議論が通用する
- ホットとコールドでコードをまとめる
- 関数ポインタや仮想関数を避ける
likelyやunlikelyを使って最適化を促す- もしものときは、コードのアライメントにも注目を向けてみる