1. メモリ階層

  1. キャッシュをアクセス。
  2. キャッシュになければ(cash miss)主記憶をアクセス。
  3. 主記憶の内容をキャッシュにコピー。これで次回からはキャッシュで見つかる(キャッシュ・ヒット、cash hit)。
  4. 場所を空ける必要があれば古いものを主記憶に掃き出す。

    1. キャッシュ機構

  1. メモリを2wバイトづつワードに区切る。
  2. 2lワードづつブロックに分ける(キャッシュ・ブロック)。
  3. ブロックを2m個のグループ(キャッシュ・ライン)に分ける。グループ内のブロックはタグで区別できる。
  4. キャッシュは2m個のエントリを持ち、各グループ内から1ブロックをキャッシュに格納し、格納したブロックを区別するタグを記録する。

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

 

読み込み

ワードごと読み込んでからシフト。

書き出し

ワードごと読み込み、そこへ書きこんでから書き戻す。

高価につく。ワード・アクセスが基本。

時間的局所性

最近アクセスしたデータはキャッシュ上にある可能性が高い。

空間的局所性

最近アクセスしたデータの近所はキャッシュ上にある可能性が高い。

キャッシュ・コンフリクト

同じキャッシュライン上で異なるブロックにあるデータを交互にアクセスすると毎回キャッシュミス。

    1. キャッシュ・ブロックの整列

  1. 順にオブジェクトを並べるが、ブロックの残りの大きさがオブジェクトに足りなければ次のブロックの先頭までスキップする。
  2. オブジェクトを2のべき乗ごとのサイズ別に分類し、それぞれをキャッシュブロックに敷き詰める。

  1. 関連キャッシュブロック数が減少し、読み込みが早くなる。
  2. キャッシュ空間の有効利用。

命令キャッシュにおける整列

497pのコードでxがめったに真にならないならば、基本ブロックQの実行頻度は低い。この場合、21.4(a)より21.4(b)のような配置のほうがキャッシュを無駄に占有しない。)

    1. 先読み

 

上図はテキストの図21.5に印を付けたもの。

  1. 先読みせずレジスタへの読みこみが終わるまで命令の実行が遅延された場合。灰色の部分が遅延された命令。キャッシュの遅れに比例して一時記憶の必要が増す。
  2. 先読みした場合。遅延を隠蔽できるだけ先の繰り返しで必要になる領域を含むキャッシュ・ブロックが読みこまれるように先読み命令が挟まれている。先読み命令同士が干渉しない配慮もあり。あまり一時記憶の必要性が増加しない。(定常状態での挙動を示すため、繰り返し初回のための先読みは考えていない。)

先読み命令

書き出し時の先読み

Fetch on write

キャッシュ・ミスの度に読みこみが発生するので先読みが必要。要領は読みこみの場合と一緒。ただし上書きされる前のキャッシュ上のデータはゴミ。

Write validate

問題なし。印が付けられたワードも程なく上書きされる。

Write around

書きこんだ後で読み出すデータは先読みする必要がある。

 

先読みに関するまとめ

  1. マシンに先読み命令、あるいは停止しない読み込み命令がある。
  2. 動的に実行順序が変更できない、あるいは隠蔽したいキャッシュの遅れに対して実行順序変更を記録するバッファが小さい。
  3. データがキャッシュより大きく、キャッシュに載っていないと予想できる。

    1. ループ交換

(j’,k’)で計算された値を(j,k)で利用。

Read-after-Write

(j’,k’)で書きこんだ領域を(j,k)で上書き。

Write-after-Write

(j’,k’)で読みこむ領域に(j,k)で書きこむ。

Write-after-Read

    1. ブロック化

スカラ置換

メモリの各階層に対するブロック化

ループの展開とジャム

  1. 一次キャッシュ用ブロッキング変換
  2. 二次キャッシュ用ブロッキング変換
  3. スカラ置換
  4. レジスタ階層のための展開とジャム

    1. ガベージ・コレクションとメモリ階層

世代

逐次的な割り当て

少ないキャッシュ・コンフリクト

割り当て時の先読み

関連するオブジェクトのグループ化

マーク&スイープに関して(参考文献の節)

  1. ページ単位の局所性を維持し、古いオブジェクトが詰まっているページに新しく割り付けない。
  2. スイープをインクリメンタルに行う。(スイープでタッチした場所に割り付けられるから。)