本連載はHisa Ando氏による連載「コンピュータアーキテクチャ」の初掲載(2005年9月20日掲載)から第72回(2007年3月31日掲載)までの原稿を再掲載したものとなります。第73回以降、最新のものにつきましては、コチラにて、ご確認ください。

ここまでの議論は、如何にデータをできるだけ速く取り出し性能を上げるかという観点から色々なキャッシュの構造を見てきたが、それらのキャッシュにどのような種類のデータを書き込むかという点には触れず、単純にメモリに入っている情報は何でも一まとめに区別をして来なかった。しかし、今度はキャッシュにどのような種類の情報を書き込むかという観点から、キャッシュの構造を見てみよう。

命令、データ分離キャッシュ

プロセサの扱うメモリのデータとして、基本的に命令と純粋なデータがある。命令は基本的には書き換えが起こらないが、純粋データでは頻繁に内容を書き換えるというようにアクセスの方法が大きくが異なる。また、プロセサが処理を進めるにあたり、命令とデータの両者が必要となるということから、命令のキャッシュとデータのキャッシュを分離し、それぞれに最適化することが考えられた。この命令とデータのキャッシュを分離する方式をHarvardアーキテクチャと呼ぶこともある。これはHarvard大学で開発されたリレーを演算素子に使うMark Iという計算機で、命令とデータで分離したメモリ構造を用いたことに由来している。(蛇足であるが、Von Neumannアーキテクチャは命令もデータも区別無く単一のメモリに格納する方式である。)

  • 共通1次キャッシュ方式のプロセサと命令

    共通1次キャッシュ方式のプロセサと命令、データ分離1次キャッシュ方式のプロセサ

キャッシュのヒット率だけから言うと、命令とデータを区別せず、一つのキャッシュに入れる方式と比べて、半分のサイズのキャッシュを2個作って命令とデータを分離していれる方式はミス率が若干悪化する場合が多く、必ずしも有利ではない。しかし、プロセサの性能が上がってくると、一つのキャッシュメモリから命令とデータを読もうとすると、両者のアクセスが同一サイクルに重なって発生し、一方のアクセスを待たせる必要がでるなどキャッシュアクセスがボトルネックになってくる。2つのアドレスの内容を同時に読めるデュアルポートのキャッシュメモリを使うというやり方もあるが、メモリセルが大きくなり面積効率が悪くなる。また、プロセサチップ上の配置に関しても、命令キャッシュは命令処理ユニットの近くに配置し、データキャッシュは演算ユニットの近くに配置して配線を短縮して高速にアクセスしたいという要求もあり、最近のマイクロプロセサでは、殆どが命令とデータを分離した1次キャッシュを使っている。

しかし、2次、3次キャッシュでは、大きなキャッシュメモリに命令、データの区別無く詰め込む方が効率が良く、また、1次キャッシュによりアクセスの頻度が減少するため2次キャッシュアクセスはボトルネックにならないので、命令、データともに共通のキャッシュメモリを用いるUnified Cache方式が用いられるのが一般的である。

ストアデータをどのキャッシュに書き込むか?

プロセサがストア命令を実行するとデータをメモリに書き込むことになるが、キャッシュがある場合には、どのようにして書き込むかには種々の方式がありうる。キャッシュの制御方式として、データを書き込まれたときに、そのデータを1次キャッシュに書き込むだけでなく同時に2次キャッシュにも書き込むWrite Throughと呼ばれる方式と、その時点では1次キャッシュに書き込むだけで、後に別のデータを入れるために1次キャッシュのキャッシュラインを追い出す時点で、下位の2次キャッシュやメモリに書き戻すWrite Backと呼ばれる方式がある。性能の点からはWrite Backの方が有利であるが、Write Through の方が制御は簡単である。また、1次キャッシュをWrite Throughとした場合は、同時に2次キャッシュにも書き込むので、2次キャッシュにエラー訂正のECCが付いていれば1次キャッシュはパリティーチェックなどのエラー検出だけとして、エラーが検出された場合は2次キャッシュから読むというやり方が可能である。このため、Write Through の1次データキャッシュを使うプロセサもかなり存在する。

このバリエーションとして、書き込みに際して1次キャッシュをミスした場合に、 1次キャッシュにはラインを確保して書き込みを行なわず2次キャッシュへの書き込みだけで済ませる方式と、まず、1次キャッシュにラインを確保して、それから1次キャッシュと2次キャッシュに書き込みを行うWrite Allocate方式がある。書き込んだデータを再利用する確率が高い場合は、Write Allocateが有利であるが、書きっ放しで、再度利用する確率が低い場合は、Non Allocateの方が無駄が少ない。

Write Through方式は制御が簡単なことが利点であるが、下位のキャッシュやメインメモリに対してWriteアクセスの頻度を低減する効果はなく、下位メモリがビジーになるという欠点がある。 このため、アクセスが遅くアクセス頻度を減らすことが最優先となるDRAMメモリの直前のレベルのキャッシュはWrite Back Cacheとするのが有利であり、1次データキャッシュをWrite Through方式としても、その他のキャッシュはWrite Backとするプロセサが普通である。