Nishiki-Hub

国内外のPC/PCパーツ/スマホ/Appleなどの最新情報を取り上げています

CPUキャッシュの役割と Intel・AMDのそれぞれのアプローチ

本日の内容

最近、CPUのキャッシュについて、IntelもAMDも構造ごと変更するということが多くなりました。今回は、そうした技術ニュースを理解するうえでなぜCPUにおいて「キャッシュ」が重要なのかを解説します。

記憶装置

現代の大多数のコンピュータである「ノイマン型」にはコンピュータを構成する5大要素というものがあり、記憶装置はその一つです。

記憶装置は、CPUからの距離というのが非常に重要です。近ければ近いほど読み書きの速度が向上しますし、遠ければ遠いほど遅くなります。一方で、近ければの最短距離はCPU内部であり、ここは数TBなどの容量は確保できません。つまり、近いほど速度は上がるが容量は小さく、遠いほど速度は落ちるが容量が大きくなるというのが基本です。

CPUから近い順に記憶装置を並べると「レジスタ」「キャッシュ」「主記憶装置(メインメモリ)」「補助記憶装置(ストレージ)」となります。この中でレジスタについてはCPUの機構の一つであると認識することができるので、我々が想像する記憶装置の中で最も高速なのがキャッシュです。

CPUは処理を行う際に「データ」と「命令」を必要とします。この「命令」とは実質的にプログラムのことです。これらができれば近くにあれば嬉しいものです。

CPUはこれらのデータ・命令が必要になったとき、キャッシュ→主記憶装置→補助記憶装置の順にデータを探していきます。これを見ていただければ分かる通り、キャッシュは最初にデータを探しに来ることになるわけです。

クロックサイクル

この先の話を進める前にほんの数行だけ「クロックサイクル」について触れておきます。

CPUはクロック信号ごとに行動します。CPUの行動ごとにクロック信号が何サイクル必要かは大体決まっています。

クロック信号の繰り返し周期1回分の時間をクロックサイクルといいます。CPUクロックとはこのクロック信号が1秒間に何周期かを意味しているので、クロックが高い=クロックサイクルが短くなります。

行動に対して必要なクロック数は決まっているので、クロックが高いほどクロックサイクルが短くなり、行動が早くなります。

キャッシュの役割

ノイマン型コンピュータのアーキテクチャを学ぶとき、CPUが処理に必要な命令やデータを読み書きする先はメインメモリ(主記憶装置)であると学ぶはずです。実際に、CPUはメモリに対してデータを要求します。では、キャッシュの役割とは何でしょうか。

これはすなわち、メインメモリの遅さを埋め合わせるものとなります。というのも、CPUがメモリからデータを読み書きする場合、時によっては100サイクル以上の必要があるほど時間がかかります。これは、命令実行よりも遥かに長い時間です。この時間はデータ待ちで処理が進まないことから遅延(レイテンシ)として扱われることもあります。

そこで、メモリから呼び出された命令やデータを少ないクロックサイクルでアクセスすることができるキャッシュに保存しておきます。

これによって一度呼び出されてキャッシュに保存されているという条件はあるものの、この条件に当てはまる命令やデータは低レイテンシ(少ない時間)でアクセスすることができます。必要なデータがキャッシュに存在し、そこから取り出せればキャッシュヒットとなり、処理速度が向上します。特に、頻繁に使われる命令やデータほどキャッシュに残っている可能性が高いのでキャッシュヒット率は高くなります。

ちなみにZen 4のキャッシュは4~5クロックサイクルでアクセスすることができます。メモリへのレイテンシと比較すると100倍以上の差がありますから、効果は絶大でしょう。

一方、キャッシュは諸刃の剣でもあります。キャッシュヒットしなかった場合(キャッシュミスの場合)は、メモリにデータを取りに行く必要がありますが、キャッシュというものが存在しない場合と比較して、キャッシュにアクセスしたというオーバーヘッドが発生することから、全体的に処理が遅くなることが考えられます。

これを防ぐ方法はいくつかあります。例えば階層化です。多くのCPUのキャッシュには階層があり、L1キャッシュ、L2キャッシュ...と2~3程度の階層があります。CPUはL1→L2→...の順番にアクセスしていきます。L1キャッシュのほうが低レイテンシ・小容量、L2キャッシュのほうが高レイテンシ・大容量です。階層化をすることでCPUに至近距離にキャッシュを設置しながら、少し離れた位置にも大きめのキャッシュを設置する事ができます。これは結果としてより大容量のキャッシュを設置することができ、キャッシュヒット率を向上させます。

裏返せば、密度を高めてキャッシュを大きくするということでも防げますね。

別の手段では、プリフェッチという手段もあります。そもそもキャッシュはメモリから1度でも取り出されている必要があるので、使用する(可能性のある)命令やデータをあらかじめキャッシュに保存しておこうというのがプリフェッチとなります。これで、キャッシュヒットを確実にすることができます。

その他にも、ソフトウェアの設計自体でキャッシュヒット率を向上させることが可能です。

書き込みは速くならない

データの取り出しが遅い場合

キャッシュは基本的に「読み出し」にて高速化を図ります。一方で書き込みについては、どんな場合においてもメモリに行うため高速化は図れません。

理由としては、処理結果は必ずメモリに書き込む必要があります。キャッシュはメモリから取り出した内容を「コピー」しているにすぎません。実際、読み込むときにそのデータがコピーか原本であるかは関係ないのです。一方で、処理結果はメモリに書き込まなければ意味がありませんね。ある書類を書いてたとして、コピーに書き込んでも原本に書き込まなければ意味がないのと同じです。

各社のキャッシュアプローチ

では、最近のCPUに合わせてどのようなアプローチが取られているのかを見てみます。

AMD 3D V-Cache

おそらく、最近のCPUキャッシュの中で最も話題となっているのが3D V-Cacheです。

3D V-Cacheは、CCD(CPUチップレット)の上(Zen 5では下)にキャッシュを積層させることでキャッシュを増やすという技術です。Zen 5では通常のCCDで最大32MBのL3キャッシュを搭載できますが、64MBの3D V-Cacheを積層することでL3キャッシュをCCDあたり最大96MBに増やしています。

L1やL2が増えるわけではありませんので、超近距離のキャッシュヒット率を向上させることはできませんが、単純にキャッシュヒット率を向上させ、キャッシュミスヒット率を下げることが可能です。

これはRyzen X3DやEPYCにも取り入れられており、第4世代EPYCでは、1.152GBのL3キャッシュという驚異的なサイズのキャッシュを搭載しています。

Intel L0キャッシュ

IntelはLion Coveにて新たにL0キャッシュを追加しました。これは、L1キャッシュよりも低レイテンシでアクセスすることができる階層のキャッシュです。Intelの方針は「低レイテンシでアクセスできるキャッシュの増加」となります。

Golden CoveではL1データキャッシュが5サイクル、L2キャッシュが15サイクルでアクセスすることができました。一方、Lion CoveではL0キャッシュが4サイクル、L1サイクルが9サイクルとなっています。L1キャッシュのクロックサイクルを見ると少なくなっているように見えますが、実際に中身を見ますとややことなります。

Lion CoveのL0キャッシュは4サイクルでアクセスでき、Golden CoveのL1と同じ48 KBの容量を持っています。つまり、これまで48KBのキャッシュにアクセスするのに5サイクル必要だったのが、4サイクルに短縮されたのです。

そして、Lion CoveのL1キャッシュは192KBと比較的大容量。Golden CoveではL1の次、L2キャッシュが15サイクルでしたから、9サイクル以内にアクセスできるキャッシュの容量が48KBから240KBに増加したことになります。

しかし、弊害かLion CoveのL2キャッシュが1.25MBから3MBに増加しているものの、レイテンシが2サイクル増大しています。

ただ、9サイクルでアクセスできるキャッシュの容量が48KB→240KBに、17MBでアクセスできるキャッシュの容量が1.25MB→3MBに増加しているので、低レイテンシでキャッシュヒット率を向上させるということには貢献できています。

まとめ

今回は、CPUのキャッシュについて、その役割をざっと説明してみました。キャッシュの重要性をおわかりいただければ幸いです。