5.3 キャッシュの性能の測定と改善
キャッシュの性能の測定を行うためには、CPUの使用時間の式を再定義する必要がある。
メモリアクセスを考慮したCPU使用時間は、以下の式で表すことができる。
CPU時間 = (CPU実行クロック数 + メモリストールクロック数 ) * クロックサイクル数 メモリストールクロック数 = 読出メモリストールクロック数 + 書込メモリストールクロック数 読出メモリストールクロック数 = 読出件数 * 読出ミス率 * 読出ミスペナルティ 書込メモリストールクロック数 = 書込件数 * 書込ミス率 * 書込ミスペナルティ + 書込バッファストール |
メモリストールクロック数は、主にキャッシュミスが原因で発生する。
書込バッファストールは、書き込みを行おうとしたときライトバッファが満杯だったときに発生する。
だが、書込バッファストールに関しては、通常はストールが発生しないようなバッファサイズを設けるので、影響度は低い。
なので、メモリストールクロック数は、以下の式に簡略化できる。
メモリストールクロック数 = メモリアクセス件数 * ミス率 * ミスペナルティ |
主記憶の速度を変更せず、CPUのクロックだけ向上させた場合ミスペナルティは大きくなる。
(速度が増すのが理由)
次は、キャッシュの性能の改善について。
キャッシュ使用時のパフォーマンス向上には2つのアプローチがある
1. 異なるメモリブロックが、同一のキャッシュ領域を取り合うことを避ける 2. 記憶の階層を増やして、キャッシュミスペナルティを減らす |
後者はマルチレベルキャッシュといい、IntelのCPUだとL1キャッシュやL2キャッシュ等と呼ばれるモノ。
まずは、”1. 異なるメモリブロックが、同一のキャッシュ領域を取り合うことを避ける”について考える。
前節ではダイレクトマップ方式で説明したけど、他にもキャッシュの配置方法は考えられる。
ダイレクトマップ方式 メモリブロックをは、キャッシュ状の固定場所に置かれる 実装が簡単 フルアソシアティブ方式 メモリブロックをキャッシュの任意の場所に置くことができる キャッシュのミス率を下げることができる。 どこにあるか分からないので、対象データを検索する必要があるが、これはハードウェア的に 実装が面倒なので、キャッシュサイズが数が多いと大変になる 理想的ではあるけど、ちょっと現実的ではないイメージ?? セットアソシアティブ方式 各ブロックをキャッシュできる場所が複数(n個所)存在する Nウェイセットアソシアティブ方式とも呼ばれる 要は、基本ダイレクトマップ方式だけど、マップ先のブロックが2個とかもう少し多めに 用意されているイメージ |
ダイレクトマップ方式の場合、キャッシュ位置は元データのアドレス下位Nビットを見るだけでよかったけど、たとえば、2ウェイセットアソシアティブ方式の場合は、
アドレス下位Nビット * 2と、アドレス下位Nビット * 2 + 1 がキャッシュ位置になり、どっちに入っているかは都度、両方見なければいけない。
セットアソシアティブのメリットはキャッシュヒット率が上がることで、デメリットはヒット時間が増大する(セット内を探索するので)事となる。
なので、Nウェイの”N”を際限なく大きくすれば良いというわけではない。
セットアソシアティブ方式の場合は、キャッシュデータが存在するかを”探索する”と書いたけど、実際は電子回路上で行われることなので、順次調べていくわけではない。
N個のデータを同時にコンパレータで比較し、ヒットしたデータをMUXで抽出するイメージになる。
このようなアクセス方法のメモリを連想メモリと呼ぶ
また、Nウェイセットアソシアティブ方式の場合は、新たにキャッシュすべきデータが発生したときにどのデータを破棄すべきかはLRUに従うことがあ多い。
2ウェイだったら、どっちが新しいかを1bitのメモリで管理できるけど、多重度が上がると難しくなる(詳細は後の節で検討する)
キャッシュメモリの階層を増やす
キャッシュをL1キャッシュと、L2キャッシュの2階層(マルチレベルキャッシュ)にできると、採用できる戦略が増える。具体的にはL1キャッシュはヒット時間の最小化、L2キャッシュはキャッシュミス率の最小化を目指すことが多い。
関連記事
コメントを残す