今回は、メモリアクセスの高速化手法である「投機的プリフェッチ(Speculative Prefetch)」の仕組みを解説する。これは、“次のアクション”を推測して、データをキャッシュにコピーするものだ。この他、キャッシュが抱える本質的な弱点についても触れておきたい。
国際会議「IEDM」のショートコースで英国ARM Reserch社のエンジニアRob Aitken氏が、「System Requirements for Memories(システムがメモリに要望する事柄)」と題して講演した内容を紹介するシリーズの第8回である。
前回で述べたように、キャッシュメモリ(キャッシュ)には、CPUがいったんアクセスしたデータを格納している。一度アクセスしたデータは、近い将来に再利用する可能性が高い(データの時間的局所性)。もう一度アクセスしたときはメインメモリではなくキャッシュラインにアクセスすることになるので、メモリアクセスの速度が大幅に高まる。
キャッシュと異なるメモリアクセスの高速化手法に「投機的プリフェッチ(Speculative Prefetch)」がある。まだアクセスしたことはないが、近い将来にアクセスすることがほぼ確実なデータを、あらかじめキャッシュに読み込んでおく。ARM Cortex Aシリーズをはじめとする多くのCPUが、1次データキャッシュに投機的プリフェッチ機能を搭載している。
例えば、キャッシュラインにアドレス「0x8000」、次に「0x8020」、さらには「0x8040」のデータをメインメモリからコピーしたとしよう。近い将来に、アドレス「0x8060」のデータにアクセスする可能性が高い。このようにハードウェアが判断し、CPUがアクセスする前のタイミングでキャッシュにコピーしておく。
またCPUは、memset関数のような動作(例えばメモリの値をゼロに設定する動作)を検出して、キャッシュのポリシー設定をライト・アロケーションからリード・アロケーションに変更する。ここでライト・アロケーションとは、リードあるいはライトの動作でキャッシュミスが発生したとき、キャッシュラインをメインメモリからのデータで満たすポリシーを意味する。
これに対してリード・アロケーションでは、リードのキャッシュミスが発生したときのみ、キャッシュラインを満たす。メモリにゼロを書き込む動作でポリシーがライト・アロケーションだと、キャッシュラインを汚染する(無効なデータで埋める)可能性が高い(ゼロ値は初期化だと推測できる)。そこでリード・アロケーションにポリシーを変更することで、キャッシュの汚染を防ぐ。
Copyright © ITmedia, Inc. All Rights Reserved.