Keys |
Tags |
Data blocks |
Address |
Main memory |
||||||
00 |
01 |
10 |
11 |
00 |
01 |
10 |
11 |
|||
0000 |
||||||||||
0001 |
||||||||||
0010 |
||||||||||
0011 |
||||||||||
0100 |
||||||||||
0101 |
||||||||||
0110 |
||||||||||
0111 |
||||||||||
1000 |
||||||||||
1001 |
||||||||||
1010 |
001101 |
10111010 |
0010011010 |
10111010 |
||||||
1011 |
||||||||||
1100 |
||||||||||
1101 |
||||||||||
1110 |
||||||||||
1111 |
||||||||||
001101-1010=01-00 |
tag |
key |
word |
byte |
(n-(m+l+w))bits |
m bits |
l bits |
w bits |
1
ワード2wバイト、1ブロック2lワード、キャッシュ・エントリの数2m個、アドレス空間2nバイト。
キャッシュ |
主記憶 |
||
Hit 時(コンパイラの最適化に影響なし。) |
Write through |
書きこまれる。 |
書きこまれる。 |
Write back |
書きこまれる。 |
後でフラッシュ時に書きこまれる。 |
|
Miss 時(コンパイラの最適化に影響。) |
Fetch on write |
キャッシュへ読み込んでから書きこむ。プロセッサは主記憶からの読み込みを待つ。 |
読み出されるが、書きこまれない。後でフラッシュ時に書きこまれる。 |
Write validate |
書きこんで、そのワードを含むブロックの他のワードが不正であることを示す印を付けておく。 |
書きこまれないで、後でフラッシュ時に書きこまれる。 |
|
Write around |
無視 |
書きこむ。(但しプロセッサは書きこみ終わるのを待たない。) |
1cycle |
|||
レジスタ |
数十 byte |
2 〜3cycles |
|
一次 キャッシュ (命令用とデータ用に分割も。) |
8 〜64Kbyte |
7 〜10cycles |
|
二次 キャッシュ |
64K 〜2Mbyte |
70 〜100cycles |
|
主記憶 |
2M 〜2Gbyte |
106 〜107cycles |
|
ディスク |
1Gbyte 〜 |
読み込み |
ワードごと読み込んでからシフト。 |
書き出し |
ワードごと読み込み、そこへ書きこんでから書き戻す。 |
高価につく。ワード・アクセスが基本。
時間的局所性 |
最近アクセスしたデータはキャッシュ上にある可能性が高い。 |
空間的局所性 |
最近アクセスしたデータの近所はキャッシュ上にある可能性が高い。 |
キャッシュ・コンフリクト |
同じキャッシュライン上で異なるブロックにあるデータを交互にアクセスすると毎回キャッシュミス。 |
命令キャッシュにおける整列
(497pのコードでxがめったに真にならないならば、基本ブロックQの実行頻度は低い。この場合、21.4(a)より21.4(b)のような配置のほうがキャッシュを無駄に占有しない。)
上図はテキストの図21.5に印を付けたもの。
先読み命令
書き出し時の先読み
Fetch on write |
キャッシュ・ミスの度に読みこみが発生するので先読みが必要。要領は読みこみの場合と一緒。ただし上書きされる前のキャッシュ上のデータはゴミ。 |
Write validate |
問題なし。印が付けられたワードも程なく上書きされる。 |
Write around |
書きこんだ後で読み出すデータは先読みする必要がある。 |
先読みに関するまとめ
(j’,k’) で計算された値を(j,k)で利用。 |
Read-after-Write |
(j’,k’) で書きこんだ領域を(j,k)で上書き。 |
Write-after-Write |
(j’,k’) で読みこむ領域に(j,k)で書きこむ。 |
Write-after-Read |
スカラ置換
メモリの各階層に対するブロック化
ループの展開とジャム
世代
逐次的な割り当て
少ないキャッシュ・コンフリクト
割り当て時の先読み
関連するオブジェクトのグループ化
マーク&スイープに関して(参考文献の節)