Transcript パワポ資料:cache
記憶の階層とキャッシュ
天野英晴
記憶システム
膨大な容量を持ち、アクセス時間(読み出し、書き込み)
が短いメモリが欲しい!
しかし
容量の大きい(ビット単価が安い)メモリは遅い
高速なメモリは容量が小さい
お金にモノを言わせて高速なメモリをたくさん揃えても大容量化の段
階で遅くなってしまう
そこでアクセスの局所性(Locality)を利用
時間的局所性(Temporal Locality)
一度アクセスされたアドレスは近いうちにまたアクセスされる
空間的局所性(Special Locality)
一度アクセスされたアドレスに近い場所がまたアクセスされる
CPU
記憶の階層
高速小容量の
CPUの近くに置き
よく使うデータを入れておく
L1キャッシュ
ソフトウェアから
は透過
(トランスペアレント)
チップ内メモリ
~64KB 1-2clock
L2キャッシュ
~256KB 3-10clock
L3キャッシュ
SRAM
2M~4MB 10-20clock
そこになければより遅い
大容量メモリに取りに行く
主記憶
DRAM
OSが管理
4~16GB 50-100clock
補助記憶 (2次記憶)
μ-msecオーダー
数百GB
半導体メモリの分類
RAM (RWM): 揮発性メモリ
電源を切ると内容が消滅
SRAM(Static RAM)
DRAM(Dynamic RAM)
ROM(Read Only Memory):不揮発性メモリ
電源を切っても内容が保持
Mask ROM 書き換え不能
PROM(Programmable ROM) プログラム可
One Time PROM 一回のみ書き込める
Erasable PROM 消去、再書き込み可能
UV EPROM (紫外線消去型)
EEPROM (電気的消去可能型) フラッシュメモリ
容量
深さ×幅
右の表に幅を掛
ければ全体の
容量が出る
省略した言い方
でも十分(端数
を覚えている人
は少ない)
アドレス
本数
8
10
12
16
18
20
24
28
容量
省略した言
い方
256
1024
4096
65536
256
1K
4K
64K
256K
1M
16M
256M
30
32
1073741824
262144
1048576
16777216
26835456
4204067296
1G
4G
SRAM (Static RAM)
非同期式SRAM
古典的なSRAM
クロックを用いない
現在も低電力SRAMシリーズなどで用いられる
連続転送機能を強化したSSRAM (Synchronous
SRAM)が登場、高速大容量転送に用いられる
8Mbit/Chip-64Mbit/Chip程度
TSOP (Thin Small Outline Package)やBGA(Ball Grid
Array)を利用
DRAM(Dynamic RAM)
記憶はコンデンサ内の電荷によって行う
リフレッシュ、プリチャージが必要
256Mbit/Chipの大容量
連続転送は高速
SDRAM(Synchronous DRAM)の普及
DDR-SDRAMの登場
DDR2 → DDR3
DDR4、HMC(Hybrid Memory Cube)が準備中
DDR-SDRAMカードの例
下は1GBでやや小さい。今は4GB-8GBの
カードが良く使われる
SDR (Single Data Rate)
SDRAM:同期式DRAM
100MHz-133MHzの高速クロックに同期し
た読み・書きを行う
CS,RAS,CAS,WEなどの制御線の組み合わせ
でコマンドを構成
コマンドにより、同期式に読み、書き、リフレッ
シュ等を制御
バンクの切り替えにより連続読み・書きが高速に
可能
SDR-SDRAMの読み出しタイミング
CLK
Command
ACT
Read
Row
Column
Address
Data0
Data1
Data2
Data3
DDR (Double Data Rate)
SDRAM:同期式DRAM
SDR SDRAM同様の高速周波数(100MHz-
133MHz)のクロックの両エッジで転送を行うこ
とにより、倍のデータ転送レートを実現
差動クロックを利用
データストローブ信号によりタイミング調整
より豊富なコマンド
DDR-SDRAMの読み出しタイミン
グ
CLK
~CLK
Command
ACT
Read
Row
Column
Address
DQS
Data0Data1Data2Data3
DRAMのまとめ
SRAMの4倍程度集積度が大
使い難いが、連続アクセスは高速
転送はますますパケット化する傾向にある
SDR-SDRAM→ DDR-SDRAM→DDR2-SDRAM
DDR2: 800Mbps (400MHz両エッヂ) 2Gbit /Chip
DDR3: 1600Mbps (800MHz両エッヂ) 4Gbit /Chip
パッケージ:FBGA(Fine pitch Ball Grid Array)の利用
SO-DIMM(Small outline Dual dual in-line memory module)の
形で供給される: 8GByte/DIMM
現在PC用にはDDR3が標準となる
DDR-4が準備中
制御は複雑、高速なため取り扱いもたいへん
→ IP( Intellectual Property)の利用が進む
プリフェッチ機能→ 連続転送可能
1.5V電源、電気的特性の改善
フラッシュメモリ
EEPROM型の発展:小型化のために選択ゲートを用いず、ブロック
単位で消去を行う.
NOR型、NAND型、DINOR型、AND型等様々な構成法がある.
オンチップ用:高速消去可能NOR型 1Gbit程度まで
単独読み出しが可能、消去が高速
ファイルストレージ用:大容量のNAND型 1Gbit- 128Gbit/チップ
連続読み出し、消去はミリ秒オーダー掛かる
SDメモリカード・SDHCメモリカードなど、8GB-32GBが使われる
書き換え回数に制限がある
ストレージシステム:ディスク装置
トラック:同心円状のアクセスの単位
1万-5万ある
シリンダ:ヘッドの下にある
すべてのトラックのこと
ヘッド
セクタ:512B程度に分割したアクセスの単位
100-500 セクタ番号、誤り訂正符号付きのデータを含む
磁性体の塗布された円板に
データを格納
可動式のヘッドを使って読み書き
不揮発性
容量と動作速度
2.5インチー3.5インチ
ヘッド数:2-4
容量: 100GB-1TB
平均ディスクアクセス時間=
平均シーク時間(ヘッドを動かす時間)+
平均回転待ち時間+転送時間→数msec
インタフェース
ATA(Advanced Technology Attachment)
SCSI(Small Computer Systems Interface)
ディスク内にマイクロプロセッサを装備し、アクセス時間
を最適化
ディスクキャッシュの利用
キャッシュ
頻繁にアクセスされるデータを入れておく小規模高速なメモリ
CacheであってCashではないので注意
元々はコンピュータの主記憶に対するものだが、IT装置の色々なとこ
ろに使われるようになった
ディスクキャッシュ、ページキャッシュ..etc..
当たる(ヒット)、はずれる(ミスヒット)
ミスヒットしたら、下のメモリ階層から取ってきて入れ替える(リプレイ
ス)
マッピング(割り付け)
主記憶とキャッシュのアドレスを高速に対応付ける
Direct map ⇔ Full associative cache
書き込みポリシー
ライトスルー、ライトバック
リプレイス(追い出し)ポリシー
LRU (Least Recently Used)
アドレスマッピング(割り付け)
ワード単位に割り付けるのは効率が悪い
一定の連続アドレスのブロック(ライン)を管理単位と
する
ブロックサイズは8byte-128byte程度
ここでは8word(16byte)を使う
やや小さい
順番に割り付けていって1周したら、元に戻る
キャッシュのブロック数(セット数)が2のn乗、ブロック
サイズが2のm乗とすると、、、
残り
n
タグ (キー) インデックス
m
ブロック内アドレス
0000000000
…
0000000111
0000010000
…
0000010111
0000001000
…
0000001111
0000100000
…
0000100111
0000011000
…
0000011111
0000110000
…
0000110111
0000101000
…
0000101111
0001000000
…
0001000111
0000111000
…
0000111111
0001010000
…
0001010111
0001001000
…
0001001111
1111111000
…
1111111111
1111110000
…
1111110111
…
Direct Map
のアドレス
割り付け
主記憶:1024ワード 000 001 010 011 100 101 110 111
Index
ブロックサイズ:8ワード
Tag
0000101000
キャッシュ:64ワード
ブロック内
…
(Key)
=8ブロック
0000101111
アドレス
Direct Map
From CPU
0011010
0011 010 100
…
…
Main Memory
(1KB=128Lines)
010
Yes:Hit
=
Data
010
0011
Cache
(64B=8Lines)
Cache Directory
(Tag Memory)
8 entries X (4bit )
ディレクトリは小さくて済む
Direct Map (Conflict Miss)
From CPU
0000010
0000 010 100
…
…
Main Memory
010
No: Miss Hit
=
010
0011
0000
Cache
Cache Directory
(Tag Memory)
010を共通するキャッシュラインは
Conflict Missを起こす
0000000000
…
0000000111
0000010000
…
0000010111
0000001000
…
0000001111
0000100000
…
0000100111
0000011000
…
0000011111
0000110000
…
0000110111
0000101000
…
0000101111
0001000000
…
0001000111
0000111000
…
0000111111
0001010000
…
0001010111
0001001000
…
0001001111
1111111000
…
1111111111
1111110000
…
1111110111
…
2-way set associative
のアドレス
割り付け
00
01
Tag
(Key)
10
11
Index
0000101000
…
0000101111
キャッシュ内
アドレス
2-way set associative Map
From CPU
0011010
00110 10 100
…
…
Main Memory
(1KB=128Lines)
Yes: Hit
=
Data
10
00110
Cache
(64B=8Lines)
10
No
=
00000
Cache Directory
(Tag Memory)
4 entries X 5bit X 2
2-way set associative Map
From CPU
0000010
00000 10 100
0011010
…
…
Main Memory
(1KB=128Lines)
No
=
10
00110
Cache
(64B=8Lines)
10
Yes: Hit
=
00000
Cache Directory
(Tag Memory)
4 entries X 5bit X 2
Data
Conflict Missが減る
4-way set associative Map
From CPU
0000010
001101 0 100
0
001101
0011010
…
…
Main Memory
(1KB=128Lines)
=
=
Data
=
Cache Directory
(Tag Memory)
2 entries X 6bit X 4
000000
=
Cache
(64B=8Lines)
8-way set associative Map → Full Map
0000010
From CPU
0011010
…
…
100
0011010
0011010
Main Memory
(1KB=128Lines)
=
=
=
Data
=
=
=
Cache Directory
(Tag Memory)
7bit X 8
0000001
=
=
Cache
(64B=8Lines)
タグメモリの設計法
キャッシュ内に何ブロック入るかを計算する。
2のn乗である時
インデックスはnbitとなる
メモリ内に何ブロック入るかを計算する。
2のh乗である時
タグはh-n=mbitとなる
ダイレクトマップでは幅m,深さ2のn乗のタグメモリが必要
2-way set associativeは、インデックスが1bit減り深さが半
分となり、タグが1bitを増える。しかしこれがダブルで必要
way数が倍になる度にインデックスが1bit減り、深さが半
分になり、タグが1bit増え、タグ自体が倍になる。
書き込みポリシー
Write Through
書き込み時に主記憶にもデータを書く
Direct Write:ミス時は主記憶だけに書く
Fetch-on-write:ミス時はリプレイスしてから書く
主記憶に合わせると性能ががた落ち(Verilogの設計はそうなっ
ている)だが、Write bufferがあれば性能がさほど落ちることは
ない
Write Back
書き込みはキャッシュのみ
キャッシュと主記憶が一致:Clean、違う:Dirty
Dirtyなキャッシュブロックは書き戻し(Write Back)をしてからリ
プレイス
Write Through (Hit)
0011010
…
From CPU
…
Main Memory
(1KB=128Lines)
0011 010 100
主記憶も同時に更新
0011
Hit
Cache
(64B=8Lines)
Cache Directory
(Tag Memory)
8 entries X (4bit )
Write Data
Write Through (Miss:Direct Write)
0000010
0011010
…
…
From CPU
Main Memory
(1KB=128Lines)
0000 010 100
主記憶のみ更新
0011
Miss
Cache
(64B=8Lines)
Cache Directory
(Tag Memory)
8 entries X (4bit )
Write Data
Write Through (Miss:Fetch on Write)
0000010
0011010
…
From CPU
…
Main Memory
(1KB=128Lines)
0000 010 100
0011
0000
Miss
Cache
(64B=8Lines)
Cache Directory
(Tag Memory)
8 entries X (4bit )
Write Data
Write Back (Hit)
0011010
…
…
From CPU
Main Memory
(1KB=128Lines)
0011 010 100
Dirty
0011 1
Hit
Cache
(64B=8Lines)
Cache Directory
(Tag Memory)
8 entries X (4bit+1bit )
Write Data
Write Back (Replace)
0000010
0011010
…
…
From CPU
Write
Back
0000 010 100
Main Memory
(1KB=128Lines)
Dirty
0011 10
0000
Miss
Cache
(64B=8Lines)
Cache Directory
(Tag Memory)
8 entries X (4bit+1bit )
ライトスルーとライトバック
「ライトスルーは主記憶を待たなければならないので非
効率」というのは嘘
ちゃんとライトバッファを装備すれば性能的に悪くはならない
しかし、シングルライトが必要→DRAMに合わない
常にデータの一致が取れるのがメリット、観測性が高い、I/Oで
有利
ライトバック
常にデータ転送がブロック単位→DRAM、高速バスに適合
バスの利用率が下がる→マルチコアに適合
大体世の中はライトバックになりつつある
リプレイスポリシー
リプレイスの際、どのWayを選ぶか?
LRU (Least Recently Used)
Direct map以外のキャッシュで問題になる
最近もっとも使っていないwayを選ぶ
2-wayならば簡単→ Verilog記述参照
4-way以上は結構面倒→ 擬似的なLRUでも大体
OK
他にランダム、FIFOなどが考えられるが実際上
あまり用いられない
キャッシュの性能
キャッシュオーバーヘッド付きCPI(Clock cycles Per Instruction)=
理想のCPI +
命令キャッシュのミス率×ミスペナルティ +
データキャッシュの読み出しミス率×読み出し命令の生起確率×ミス
ペナルティ
この式の問題点
ミスペナルティは書き戻しを伴うかどうかで違ってくる(Write Back)
ライトバッファの容量、連続書き込み回数によっては書き込みミスでも
ストールする
書き込み直後に読み出しをするとキャッシュが対応できないでペナル
ティが増えることもある→ノンブロッキングキャッシュ
実際は階層化されているのでそれぞれの階層を考えないといけない
プロセッサがOut-of-order実行可能ならば読み出し時にストールしな
いかもしれない(この話は後ほど、、、)
ちゃんと評価するにはシミュレータを使うしかない、、、、
ミスの原因:3つのC
Capacity Miss:容量ミス
Conflict Miss:衝突ミス
絶対的な容量不足により起きる
容量に余裕があっても、indexが衝突することで、格納
することができなくなる
Compulsory Miss (Cold Start Miss) 初期化ミス
スタート時、プロセス切り替え時に最初にキャッシュに
ブロックを持ってくるためのミス。避けることができない
キャッシュサイズと
それぞれもミスの
割合
Hennessy &
Patterson
Computer
Architectureより
ミス率を減らす
容量を増やす
〇容量ミスはもちろん減る。衝突ミスも減る。
×コストが大きくなる。ヒット時間が増える。チップ(ボード)に載らない
Way数を増やす
〇衝突ミスが減る
キャッシュ容量が小さいと効果的、2Wayは、2倍の大きさのDirect Mapと同じ
位のミス率になる
キャッシュ容量が大きい場合、残った不運な衝突ミスを減らす効果がある
×コストが大きくなる。ヒット時間が増える。4以上はあまり効果がない。
ブロックサイズを大きくする
〇局所性によりミスが減る。
×ミスペナルテイが増える。(ブロックサイズに比例はしないが、、)
キャッシュ容量が小さいと衝突ミスが増える
容量に応じて適切なブロックサイズを選ぶ。32byte-128byte
ブロックサイズと
ミスの割合
Hennessy &
Patterson
Computer
Architectureより
ブロックサイズと
平均アクセス時間
Hennessy &
Patterson
Computer
Architectureより
ミスペナルティを減らす
階層キャッシュ
ノンブロッキングキャッシュ
CPU-Memory間に複数のキャッシュを設ける
ミス処理の間にも次のアクセスを受け付ける
Critical Word FirstとEarly Restart
CPUに対して可能な限り早くアクセスされたデータ
(命令)を渡す
CPU
マルチレベル
キャッシュ
CPUに近い
方からL1,L2..
と番号を付ける
L2・L3キャッシュの
局所ミス率は
L1キャッシュより
高い
L1キャッシュ
L2キャッシュ
L3キャッシュ
主記憶
~64KB 1-2clock
~256KB 3-10clock
2M~4MB 10-20clock
4~16GB 50-100clock
マルチレベルキャッシュの制御
Multi-level Inclusion
上位階層のキャッシュが下位階層の内容を全て含む
階層間のやり取りは、キャッシューメモリ間と同じ
メモリシステム中にデータの重複が数多く存在
Multi-level Exclusion
上位階層のキャッシュと下位階層のキャッシュの内容
が重なることはない
階層間のやり取りは、リプレースというよりはスワップ
ノンブロッキングキャッシュ
キャッシュが動作中にも次のアクセスを受け付
ける
キャッシュの操作をパイプライン化する
メモリアクセスを強化しないとノンブロッキングキャッ
シュにはできない
実際はミス中のヒットを1回許せば大体OK
CPUがアウトオブオーダ実行可能でないと効果
が小さい→来年
Critical Word FirstとEarly Restart
CPU
キャッシュに転送する前に
CPUにワードを渡す
(Early Restart)
キャッシュ
主記憶
アクセスした
ワードを先に
送る
(Critical Word
First)
プリフェッチ
アクセスする前にキャッシュに取って来る
(問題点) 使うかどうか分からないデータ(命令)のために他の
ラインを追い出していいのか??
→プリフェッチバッファを使う場合が多い
本当にアクセスされたらキャッシュに入れる
ハードウェアプリフェッチ
命令キャッシュで用いる。一つ(二つ)先のブロックまで取って来
る
命令キャッシュは局所性が高いので効果的
ソフトウェアプリフェッチ
プリフェッチ命令を使う:データキャッシュ
コンパイラが挿入
命令実行のオーバーヘッドを伴う
コンパイラによる最適化
ループ構造の最適化
ループの入れ子を入れ替える
for(j=0; j<100; j=j+1)
for(i=0; i<5000;
i=i+1)
x[i][j] = a * x[i][j];
ループをくっつける
ブロック化
for(i=0; i<5000; i=i+1)
for(j=0; j<100; j=j+1)
x[i][j] = a * x[i][j];
キャッシュにうまく入るようにデータ構造を変更する
科学技術計算には効果的
仮想記憶(Virtual Memory)
プロセッサから見たアドレス(論理アドレス)と実際のメモリ上のアドレ
ス(物理アドレス)を分離する
実メモリよりも大きいメモリを扱うことができる
複数のプロセスを互いのアドレスを気にせずに並行実行可能
管理単位で記憶の保護
ページ:固定サイズ(4K-16KB) vs. セグメント:可変サイズ→ページ
を用いる場合が多い
概念はキャッシュに似ているがOSが管理、用語も違う
ブロック(ライン):32-128B ⇔ ページ:4KB
リプレイス スワップイン
ライトバック ⇔ スワップアウト
ページの割り付けはOSが管理
リプレイスはLRU(Least Recently Used)
書き込み制御は当然ライトバック
仮想記憶のアドレス変換
論理アドレス空間(4GB)
ページ番号
20bit
ページ内
アドレス
12bit
物理アドレス空間(16MB)
TLB
12bit
12bit
20bit→12bitの変換テーブルは巨大
ソフトウェアで管理
TLB(Translation Lookaside Buffer)はこの変換テーブルに
対するキャッシュ
TLB(Translation Lookaside Buffer)
論理アドレス
ページ番号
ページ内アドレス
00110101011100000010 001011001100
Dirty
bit
Priority
bit
=
=
00110101011100000010
=
111011001110
=
=
=
=
物理アドレス
=
111011001110 001011001100
ページフォルト(Page Fault)の発生
3年のコンピュータアーキテクチャ、OSの授業で
学ぶ例外処理の一つ
TLBミス
ヒットしたがDirty bitが0のページに書き込みを
行った
ページ自体は主記憶中に存在→TLBの入れ替え
ページ自体が主記憶中にない→スワップイン+TLB
の入れ替え
Dirty bitのセット
ヒットしたが特権命令でないのに特権ページを
扱った
いずれのケースもOSで処理する
TLB変換時間の短縮
仮想アドレスキャッシュ
キャッシュは仮想アドレスで参照する
プロセスによってアドレスがダブる問題(シノニム問題)の解決
が難しい
仮想アドレスインデックス-物理アドレスタグ方式
(Virtually indexed, Physically Tagged)
変換を行わないページ内アドレスをキャッシュのインデックスに
使う
タグ参照、キャッシュ参照、TLB変換が同時に可能
Direct Mapだとキャッシュサイズが4KBに制限される
2 way だと8K、4 wayだと16K、8 wayだと32K
1次キャッシュだけの話なので、多少小さくてもいいか。。。。
仮想アドレスインデックス・物理アドレス
タグ方式
ページ番号
20bit
ページ内アドレス(12bit)
index
Tag
Mem.
TLB
12bit Tag
キャッシュ
=
Hit
CPUへ
演習1
0x00番地からサイズ8の配列A[i]が、0x40番地から同じ
くサイズ8の配列B[i]が割り付けられている。
enshu.asmは以下を計算するプログラムである
int i,dsum;
dsum =0;
for(i=0; i<8;i++)
dsum += B[i]-A[i];
これをダイレクトマップのキャッシュ(direct)で実行したとき
と2ウェイセットアソシアティブ(2way)で実行したときで、
両者のミスの回数と、演算結果が出るまでのクロック数
(pcがc番地になったら終了と考えよう)をシミュレーショ
ンして求めよ。
演習2
64kワードの主記憶に対して4kワードのキャッ
シュを設ける
ブロックサイズは16ワードとする
ダイレクトマップ、2way set associative、4way
set associativeキャッシュのタグメモリ構成をそ
れぞれ示せ
ヒント:タグメモリの設計法のページを参照!
演習3
あるキャッシュのブロックにマップされた互いに衝突するアドレ
スA,Bに対して以下のアクセスを順に行う。
1.
Aから読み出し
2.
Bから読み出し
3.
Aに書き込み
4.
Aから読み出し
5.
Bに書き込み
6.
Aから読み出し
7.
Aに書き込み
ダイレクトライト型のライトスルーキャッシュ、ライトバックキャッシュについ
て、それぞれのアクセスがミスするかヒットするかを示せ。また、各アクセ
スによってメモリに対してどのような操作(リプレイスR、ライトバックWB、ラ
イトスルーの書き込みWTH)が必要か?ライトバックについてはブロックは
C、Dのうちどちらの状態になるか?