キャッシュヒエラルキー - 百科事典

キャッシュヒエラーキー、またはマルチレベルキャッシュは、データをキャッシュするためのメモリアーキテクチャで、異なるアクセス速度に基づいてメモリストレージの階層を使用します。高度に要求されるデータは高速アクセスメモリストレージにキャッシュされ、中央処理装置(CPU)コアがより迅速にアクセスできるようになります。

キャッシュヒエラーキーはメモリヒエラーキーの一部であり、階層的なストレージの一形態と考えられます。この設計は、メインメモリアクセスのメモリレイテンシーにもかかわらず、CPUコアがより高速に処理できるように意図されています。メインメモリへのアクセスは、CPUがデータを待つ間にCPUコアのパフォーマンスのボトルネックとなり得ますが、すべてのメインメモリを高速化することはコスト的に不適切です。高速キャッシュは、CPUが最も使用するデータに高速アクセスを許可する妥協策であり、より高速なCPUクロックを可能にします。

背景
コンピュータと電子チップ開発の歴史において、CPUのスピードの増加がメモリアクセス速度の改善を超えた時期がありました。CPUとメモリの速度のギャップは、CPUがしばしば無駄な時間を過ごす原因となりました。CPUは、与えられた時間内により多くの命令を実行できるようになりつつも、メインメモリからのデータアクセスに必要な時間がプログラムがこの能力を最大限に活用するのを妨げました。この問題は、より高速なプロセッサの可能性を発見するために、アクセス速度の高いメモリモデルの作成を促進しました。

これにより、1965年にケンブリッジ大学のイギリスのコンピュータサイエンティスト、モーリス・ウィルキスによって最初に提案されたキャッシュメモリの概念が生まれました。彼はこのようなメモリモデルを「スレイブメモリ」と呼びました。約1970年から1990年まで、アナント・アガラワル、アラン・ジェイ・スミス、マーク・D・ヒル、トーマス・R・プザクなどによって、より良いキャッシュメモリの設計についての論文や記事が発表されました。最初のキャッシュメモリモデルはその時点で実装されましたが、研究者がより良い設計を調査し提案する中で、より高速なメモリモデルへのニーズが続いていました。このニーズは、初期のキャッシュモデルがデータアクセスレイテンシーを改善したにもかかわらず、コストと技術的な制約によってメインメモリのサイズに近づくことは実現不可能であるという事実から生じました。1990年以降、最初のキャッシュにバックアップとして別のキャッシュレベル(第二レベル)を追加するアイデアなどのアイデアが提案されました。ジャンル・ルー・バエール、ウェン・ハン・ワン、アンドリュー・W・ウィルソンなどがこのモデルに関する研究を行いました。いくつかのシミュレーションや実装が二レベルキャッシュモデルの利点を示した後、マルチレベルキャッシュの概念が新しいかつ一般的に良いキャッシュメモリモデルとして受け入れられました。2000年以降、マルチレベルキャッシュモデルは広く注目され、現在、多くのシステムで実装されています。例えば、インテルのCore i7製品に存在する3レベルキャッシュです。

マルチレベルキャッシュ
各命令実行ごとにメインメモリにアクセスすることは、データを見つけたり取得したりする時間に依存するため、低速の処理につながる可能性があります。このメモリレイテンシーをプロセッサから隠すために、データキャッシュが使用されます。プロセッサがデータが必要な場合、メインメモリから取得され、より小さいメモリ構造であるキャッシュに保存されます。そのデータが必要な場合、まずキャッシュを検索し、その後メインメモリに移動します。この構造は、メインメモリに対する検索と取得時間の観点から、プロセッサに近く存在します。キャッシュを使用する利点は、キャッシュヒエラーキーを持つかどうかを計算することで証明できます。

= 平均アクセス時間(AAT) =
キャッシュはサイズが小さいため、キャッシュ内の検索が求められた情報を提供しない「ミス」が頻繁に発生し、データを取得するためにメインメモリにアクセスする必要があります。したがって、AATはデータを検索するための各構造のミス率に影響されます。




AAT

=

hit time

+
(
(

miss rate

)
×
(

miss penalty

)
)


{\displaystyle {\text{AAT}}={\text{hit time}}+(({\text{miss rate}})\times ({\text{miss penalty}}))}


メインメモリのAATは、Hit time main memoryで与えられます。キャッシュのAATは次のように与えられます:

Hit Timecache + (Miss Ratecache × Miss Penaltytime taken to go to main memory after missing cache).
キャッシュのヒット時間はメインメモリのヒット時間よりも短いため、キャッシュを通じてデータにアクセスする場合、データ取得のAATは著しく低くなります。

= 取引 =
キャッシュを使用することでメモリレイテンシーが改善されるかもしれませんが、キャッシュの構成やトラバース方法によっては、データ取得時間に対する必要な改善が得られないことがあります。例えば、同じサイズの直接マッピングキャッシュは、完全に連結キャッシュよりもミス率が高いです。これは、プロセッサをテストするコンピュータのベンチマークや命令のパターンにも依存しますが、完全に連結キャッシュを使用すると、キャッシュを毎回全て検索する必要があるため、より多くの電力消費が発生します。このため、電力消費(および関連する熱)とキャッシュのサイズの間の取引がキャッシュ設計において重要となります。

= 発展 =
キャッシュミスの場合、その構造を使用する目的は無効となり、コンピュータは必要なデータを取得するためにメインメモリにアクセスする必要があります。しかし、マルチレベルキャッシュがある場合、コンピュータがプロセッサに最も近いキャッシュ(レベル1キャッシュまたはL1)をミスすると、次に最も近いレベルのキャッシュを検索し、これらの方法が失敗した場合にのみメインメモリに移動します。一般的なトレンドは、L1キャッシュを小さくし、プロセッサから1~2つのCPUクロックサイクルの距離に配置することで、より大きなデータを格納できるため、より遠くでもミス率が低いレベルのキャッシュを増やします。これにより、より良いAATが得られます。キャッシュレベルの数は、コスト、AAT、およびサイズの間の取引を確認した後にアーキテクチャによって設計されます。

= 性能向上 =
メモリシステムが単一のチップに収まる技術スケーリングが可能になった場合、ほとんどの現代のプロセッサは3つから4つのキャッシュレベルを持っています。AATの削減は、例えば、L3キャッシュまでの異なる構成のAATをチェックすることで理解できます。

例:メインメモリ = 50 ns、L1 = 1 nsで10%のミス率、L2 = 5 nsで1%のミス率、L3 = 10 nsで0.2%のミス率。

キャッシュなし、AAT = 50 ns
L1キャッシュ、AAT = 1 ns + (0.1 × 50 ns) = 6 ns
L1–2キャッシュ、AAT = 1 ns + (0.1 × [5 ns + (0.01 × 50 ns)]) = 1.55 ns
L1–3キャッシュ、AAT = 1 ns + (0.1 × [5 ns + (0.01 × [10 ns + (0.002 × 50 ns)])]) = 1.5101 ns

= 缺点 =
キャッシュメモリはメインメモリよりも増加した边际コストがかかるため、全体のシステムのコストが増加する可能性があります。
キャッシュデータは、キャッシュに電力が供給される限りのみ保存されます。
メモリシステムに必要なチップ上の領域が増加します。
大きなプログラムで時間的なローカリティが悪く、頻繁にメインメモリにアクセスする場合、利点が最小化されたり消えたりする可能性があります。

性質


= バンキングと統合 =
バンキングキャッシュでは、キャッシュが命令ストレージ専用のキャッシュとデータストレージ専用のキャッシュに分割されます。対照的に、統合キャッシュには命令とデータが同じキャッシュに含まれています。プロセス中に、L1キャッシュ(またはプロセッサへの接続に関連する最も上位のキャッシュ)はプロセッサによってアクセスされ、命令とデータを取得します。この両方のアクションが同時に実行される必要があるため、統合キャッシュでは複数のポートが必要で、アクセス時間が増加します。複数のポートを持つと、追加のハードウェアとワイヤが必要で、キャッシュとプロセッサの間に大きな構造が生まれます。これを避けるために、L1キャッシュは通常バンキングキャッシュとして構成され、ポートが少なくなり、ハードウェアが少なくなり、一般的にアクセス時間が低くなります。現代のプロセッサでは、キャッシュが分離されており、マルチレベルキャッシュを持つシステムでは、下位のキャッシュが統合されていることがあります。

= インクルージョンポリシー =

上位のキャッシュレベルに存在するブロックが下位のキャッシュレベルに存在するかどうかは、メモリシステムのインクルージョンピリシーによって制御されます。これには、インクルーシブ、エクスクルーシブ、非インクルーシブ非エクスクルーシブ(NINE)があります。

インクルーシブポリシーでは、上位のキャッシュに存在するすべてのブロックが下位のキャッシュにも存在する必要があります。各上位のキャッシュコンポーネントは、下位のキャッシュコンポーネントのサブセットです。この場合、ブロックの重複があるため、メモリの無駄が発生しますが、チェックが速くなります。

エクスクルーシブポリシーでは、キャッシュヒエラーキーのすべてのコンポーネントが完全にエクスクルーシブであり、上位のキャッシュに存在する要素が下位のキャッシュのいずれにも存在しないことを意味します。これにより、キャッシュメモリの完全な使用が可能になりますが、メモリアクセスレイテンシが高くなります。

上記のポリシーは、これらを実装するためにルールセットが必要です。これらのいずれも強制されない場合、結果としてのインクルージョンピリシーは非インクルーシブ非エクスクルーシブ(NINE)と呼ばれます。これは、上位のキャッシュが下位のキャッシュに存在するかどうかが任意であることを意味します。

= ライトポリシー =
変更されたキャッシュブロックがメインメモリにどのように更新されるかを定義するポリシーは2つあります:ライトスルーとライトバックです。

ライトスルーポリシーでは、キャッシュブロックの値が変更されるたびに、下位レベルのメモリヒエラーキーでもさらに変更されます。このポリシーは、データがヒエラーキー全体を通じて書き込まれるたびに安全に保存されることを保証します。

しかし、ライトバックポリシーでは、変更されたキャッシュブロックはキャッシュブロックがエビウム(排出)されるまで、下位レベルのヒエラーキーに更新されません。各キャッシュブロックに「ディレーティビット」が付属し、キャッシュブロックが変更されたときにセットされます。排出中にディレーティビットがセットされたブロックは、下位レベルのヒエラーキーに書き込まれます。このポリシーでは、データがキャッシュにのみ保存されている最も最近の変更されたコピーがリスクがあり、修正技術が観察される必要があります。

キャッシュブロックにバイトが存在しない場合、書き込み割り当てポリシーまたは書き込み非割り当てポリシーによって、キャッシュにバイトを取得するかどうかが決定されます。書き込み割り当てポリシーでは、書き込みミスの場合、ブロックがメインメモリから取得され、キャッシュに配置される前に書き込まれます。書き込み非割り当てポリシーでは、ブロックがキャッシュでミスすると、ブロックをキャッシュに取得せずに下位レベルのメモリヒエラーキーに書き込みます。

ポリシーの一般的な組み合わせは「ライトバック、ライト割り当て」および「ライトスルー、ライト非割り当て」です。

= シェアードとプライベート =

プライベートキャッシュは、プロセッサの特定のコアに割り当てられ、他のコアではアクセスできません。一部のアーキテクチャでは、各コアに独自のプライベートキャッシュがあります;これにより、システムのキャッシュアーキテクチャに重複のブロックが生じ、キャッシュの容量効率が低下します。しかし、このような設計選択がマルチレベルキャッシュアーキテクチャで良いこともあります。これは、データアクセスレイテンシーが低いことを意味します。

シェアードキャッシュは、複数のコアでアクセスできるキャッシュです。シェアされているため、キャッシュの各ブロックはユニークであり、したがって、重複のブロックが存在しないため、ヒット率が高くなります。しかし、複数のコアが同じキャッシュにアクセスしようとすると、データアクセスレイテンシーが増加します。

マルチコアプロセッサでは、キャッシュをシェアードまたはプライベートにする設計選択がプロセッサのパフォーマンスに影響を与えます。実際には、上位のキャッシュL1(または時にはL2)はプライベートとして実装され、下位のキャッシュはシェアードとして実装されます。この設計は、上位のキャッシュに高いアクセス率を提供し、下位のキャッシュに低いミス率を提供します。

最近の実装モデル


= Intel Xeon Emerald Rapids (2024) =
最大64コア:

L1キャッシュ – 各コア80 KB
L2キャッシュ – 各コア2 MB
L3キャッシュ – 各コア5 MB(合計320 MB)

= Intel i5 Raptor Lake-HX (2024) =
6コア(パフォーマンス|効率):

L1キャッシュ – 各コア128 KB
L2キャッシュ – 各コア2 MB | 4~8 MB半シェアード
L3キャッシュ – 20~24 MBシェアード

= AMD EPYC 9684X (2023) =
96コア:

L1キャッシュ – 各コア64 KB
L2キャッシュ – 各コア1 MB
L3キャッシュ – 1152 MBシェアード

= Apple M1 Ultra (2022) =
20コア(4:1 "パフォーマンス"コア | "効率"コア):

L1キャッシュ – 各コア320|192 KB
L2キャッシュ – 52 MB半シェアード
L3キャッシュ – 96 MBシェアード

= AMD Ryzen 7000 (2022) =
6~16コア:

L1キャッシュ – 各コア64 KB
L2キャッシュ – 各コア1 MB
L3キャッシュ – 32~128 MBシェアード

= AMD Zen 2マイクロアーキテクチャ(2019) =
L1キャッシュ – 各コア32 KBデータ & 32 KB命令、8ウェイ
L2キャッシュ – 各コア512 KB、8ウェイインクルーシブ
L3キャッシュ – 各4コアCCXごとにローカル16 MB、2 CCXごとにチップレット、16ウェイ非インクルーシブ。デスクトップCPUでは最大64 MB、サーバーCPUでは最大256 MB

= AMD Zenマイクロアーキテクチャ(2017)