CPUキャッシュ

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ

CPUキャッシュは、コンピューター中央処理装置(CPU)が、メインメモリからのデータにアクセスするための平均コスト(時間またはエネルギー)を削減するために使用するハードウェアキャッシュです。[1]キャッシュは、プロセッサコアの近くに配置された、より小さく高速なメモリであり、頻繁に使用されるメインメモリの場所からのデータのコピーを格納します。ほとんどのCPUには、複数のキャッシュレベル(L1、L2、多くの場合L3、まれにL4)の階層があり、レベル1には異なる命令固有およびデータ固有のキャッシュがあります。

ほとんどのCPUが持つ メモリ管理ユニット(MMU)の一部であるトランスレーションルックアサイドバッファ(TLB)など、他のタイプのキャッシュが存在します(上記の最も重要なキャッシュの「キャッシュサイズ」にはカウントされません)。

概要

メインメモリ内の場所から読み取りまたは書き込みを試みる場合、プロセッサはその場所のデータがすでにキャッシュにあるかどうかを確認します。その場合、プロセッサは、はるかに遅いメインメモリではなく、キャッシュからの読み取りまたはキャッシュへの書き込みを行います。

最新のデスクトップサーバー、および産業用CPUの多くには、少なくとも3つの独立したキャッシュがあります。

命令キャッシュ
実行可能命令のフェッチを高速化するために使用されます
データキャッシュ
データのフェッチと保存を高速化するために使用されます。データキャッシュは通常、より多くのキャッシュレベル(L1、L2など。以下のマルチレベルキャッシュも参照)の階層として編成されます。
トランスレーションルックアサイドバッファ(TLB)
実行可能命令とデータの両方の仮想アドレスから物理アドレスへの変換を高速化するために使用されます。命令とデータの両方にアクセスするために単一のTLBを提供することも、個別の命令TLB(ITLB)とデータTLB(DTLB)を提供することもできます。ただし、TLBキャッシュはメモリ管理ユニット(MMU)の一部であり、CPUキャッシュに直接関連していません。

歴史

NeXTcubeコンピューターマザーボード(1990)。中央から左の画像の下端には、25MHzで動作するCPUMotorola 68040があり、チップ上にそれぞれ4 KiBの2つの別々のレベル1キャッシュがあり、1つはCPU部分用、もう1つは統合FPUです。外部キャッシュ。

キャッシュを使用した最初のCPUには、1レベルのキャッシュしかありませんでした。後のレベル1キャッシュとは異なり、L1d(データ用)とL1i(命令用)に分割されませんでした。スプリットL1キャッシュは1976年にIBM801 CPUで開始され、[2] [3]は1980年代後半に主流になり、1997年にARMv5TEで組み込みCPU市場に参入しました。2015年には、1ドル未満のSoCでさえL1キャッシュを分割しました。また、L2キャッシュがあり、より大きなプロセッサの場合はL3キャッシュもあります。L2キャッシュは通常分割されず、すでに分割されているL1キャッシュの共通リポジトリとして機能します。マルチコアプロセッサのすべてのコア専用のL1キャッシュがあり、通常はコア間で共有されません。L2キャッシュ、および上位レベルのキャッシュは、コア間で共有できます。L4キャッシュは現在一般的ではなく、通常、スタティックランダムアクセスメモリ(SRAM)ではなく、ダイナミックランダムアクセスメモリ(DRAM)上にあり、別のダイまたはチップ上にあります(例外的に、eDRAMの形式はL1までのすべてのレベルのキャッシュに使用されます。これは歴史的にL1にも当てはまりましたが、より大きなチップでは、最後のレベルを除いて、L1と一般的にすべてのキャッシュレベルの統合が可能になりました。キャッシュの各追加レベルは、より大きく、最適化が異なる傾向があります。

キャッシュ(歴史的にRAMの場合と同様)は、通常、2、4、8、16などの累乗のサイズになっています。KiB ; 最大MiBサイズの場合(つまり、L1以外のサイズが大きい場合)、パターンの非常に早い段階で、サイズを2倍にするパラダイムに強制されることなくキャッシュを大きくすることができます。たとえば、Intel Core 2Duoと3MiBL2キャッシュがあります。 2008年4月。ただし、L1サイズの場合は、まだ少数のKiBしかカウントされませんが、2012年のIBM zEC12は例外であり、その時点で異常に大きな96 KiB L1データキャッシュを取得します。たとえば、IBMz13には96 KiB L1命令キャッシュ(および128 KiB L1データキャッシュ)、[4]およびIntel Ice Lake2018年以降のベースのプロセッサ。48KiBL1データキャッシュと48KiBL1命令キャッシュを備えています。2020年には、一部のIntel Atom CPU(最大24コア)のキャッシュサイズは4.5MiBと15MiB(の倍数)になります。[5] [6]

キャッシュエントリ

データは、キャッシュラインまたはキャッシュブロックと呼ばれる固定サイズのブロックでメモリとキャッシュの間で転送されますキャッシュラインがメモリからキャッシュにコピーされると、キャッシュエントリが作成されます。キャッシュエントリには、コピーされたデータと、要求されたメモリ位置(タグと呼ばれる)が含まれます。

プロセッサがメモリ内の場所を読み書きする必要がある場合、最初にキャッシュ内の対応するエントリをチェックします。キャッシュは、そのアドレスを含む可能性のあるキャッシュラインで、要求されたメモリ位置の内容をチェックします。プロセッサがメモリ位置がキャッシュ内にあることを検出した場合、キャッシュヒットが発生しています。ただし、プロセッサがキャッシュ内のメモリ位置を見つけられない場合は、キャッシュミスが発生しています。キャッシュヒットの場合、プロセッサはすぐにキャッシュラインのデータを読み書きします。キャッシュミスの場合、キャッシュは新しいエントリを割り当て、メインメモリからデータをコピーします。その後、キャッシュの内容から要求が実行されます。

ポリシー

置換ポリシー

キャッシュミス時に新しいエントリ用のスペースを確保するために、キャッシュは既存のエントリの1つを削除する必要がある場合があります。削除するエントリを選択するために使用するヒューリスティックは、置換ポリシーと呼ばれます。置換ポリシーの基本的な問題は、将来使用される可能性が最も低い既存のキャッシュエントリを予測する必要があることです。将来を予測することは難しいため、利用可能なさまざまな交換ポリシーの中から選択する完璧な方法はありません。最も最近使用されていない(LRU) という人気のある置換ポリシーの1つは、最も最近アクセスされていないエントリを置き換えます。

一部のメモリ範囲をキャッシュ不可としてマークすると、再アクセスされることがめったにないメモリ領域のキャッシュを回避することにより、パフォーマンスを向上させることができます。これにより、再利用せずにキャッシュに何かをロードするオーバーヘッドが回避されます。キャッシュエントリは、コンテキストに応じて無効化またはロックされる場合もあります。

ポリシーを書く

データがキャッシュに書き込まれる場合、ある時点でメインメモリにも書き込まれる必要があります。この書き込みのタイミングは、書き込みポリシーと呼ばれます。ライトスルーキャッシュでは、キャッシュへの書き込みごとにメインメモリへの書き込みが発生します。または、ライトバックまたはコピーバックキャッシュでは、書き込みはメインメモリにすぐにはミラーリングされず、代わりにキャッシュは上書きされた場所を追跡し、ダーティとしてマークします。これらの場所のデータは、そのデータがキャッシュから削除された場合にのみメインメモリに書き戻されます。このため、ライトバックキャッシュでの読み取りミスにより、サービスへの2つのメモリアクセスが必要になる場合があります。1つは最初にダーティロケーションをメインメモリに書き込み、もう1つはメモリから新しいロケーションを読み取ります。また、ライトバックキャッシュにまだマップされていないメインメモリの場所への書き込みは、すでにダーティな場所を排除し、それによって新しいメモリの場所のためにそのキャッシュスペースを解放する可能性があります。

中間ポリシーもあります。キャッシュはライトスルーの場合がありますが、書き込みはストアデータキューに一時的に保持される場合があります。通常、複数のストアを一緒に処理できます(これにより、バスのターンアラウンドを減らし、バスの使用率を向上させることができます)。

メインメモリからキャッシュされたデータは、他のエンティティ(たとえば、ダイレクトメモリアクセス(DMA)またはマルチコアプロセッサの別のコアを使用する周辺機器)によって変更される可能性があります。その場合、キャッシュ内のコピーは古くなる可能性があります。古い。または、マルチプロセッサシステムのCPUがキャッシュ内のデータを更新すると、他のCPUに関連付けられているキャッシュ内のデータのコピーが古くなります。データの一貫性を維持するキャッシュマネージャー間の通信プロトコルは、キャッシュコヒーレンスプロトコルと呼ばれます。

キャッシュパフォーマンス

キャッシュパフォーマンスの測定は、メモリパフォーマンスとプロセッサパフォーマンスの間の速度ギャップが指数関数的に増加している最近の時代に重要になっています。キャッシュは、この速度のギャップを減らすために導入されました。したがって、特に高性能システムでは、キャッシュがプロセッサとメモリの速度のギャップをどれだけうまく埋めることができるかを知ることが重要になります。キャッシュヒット率とキャッシュミス率は、このパフォーマンスを決定する上で重要な役割を果たします。キャッシュのパフォーマンスを向上させるために、ミス率を減らすことは、他のステップの中で必要なステップの1つになります。キャッシュへのアクセス時間を短縮すると、パフォーマンスも向上します。

CPUストール

CPUがキャッシュラインを待機している間に実行することが不足するため、メモリから1つのキャッシュラインをフェッチするのにかかる時間(キャッシュミスによる読み取り遅延)が重要になります。CPUがこの状態に達すると、それはストールと呼ばれます。CPUがメインメモリと比較して高速になると、キャッシュミスによるストールがより多くの潜在的な計算に取って代わります。最新のCPUは、メインメモリから単一のキャッシュラインをフェッチするのにかかる時間で数百の命令を実行できます。

この間、CPUをビジー状態に保つために、キャッシュミスデータを待機している命令の後にCPUが独立した命令を実行しようとするアウトオブオーダー実行など、さまざまな手法が採用されています。多くのプロセッサで使用されているもう1つのテクノロジは、同時マルチスレッディング(SMT)です。これにより、最初のスレッドが必要なCPUリソースが利用可能になるのを待つ間、代替スレッドがCPUコアを使用できるようになります。

結合性

特定のキャッシュロケーションによってメモリロケーションをキャッシュできるさまざまな方法の図

配置ポリシーは、メインメモリの特定のエントリのコピーをキャッシュのどこに配置するかを決定します。配置ポリシーがコピーを保持するためにキャッシュ内の任意のエントリを自由に選択できる場合、キャッシュは完全に関連付けられていると呼ばれます。もう一方の極端な例では、メインメモリの各エントリがキャッシュ内の1つの場所にのみ配置できる場合、キャッシュは直接マップされます。多くのキャッシュは、メインメモリ内の各エントリがキャッシュ内のN個の場所のいずれかに移動できるという妥協案を実装しており、N-way setassociativeとして記述されています。[7]たとえば、AMD Athlonのレベル1データキャッシュは双方向セットアソシアティブです。つまり、メインメモリ内の特定の場所をレベル1データキャッシュ内の2つの場所のいずれかにキャッシュできます。

結合性の適切な値を選択するには、トレードオフが必要です。配置ポリシーがメモリ位置をマップできた場所が10個ある場合、その位置がキャッシュ内にあるかどうかを確認するには、10個のキャッシュエントリを検索する必要があります。より多くの場所をチェックすると、より多くの電力とチップ領域が必要になり、場合によってはより多くの時間がかかります。一方、関連性の高いキャッシュではミスが少なくなるため(以下の競合ミスを参照)、CPUが低速のメインメモリからの読み取りに費やす時間が少なくなります。一般的なガイドラインでは、直接マッピングから双方向、または双方向から4方向への結合性を2倍にすると、キャッシュサイズを2倍にするのとほぼ同じ効果がヒット率に影響します。ただし、結合性を4を超えて増やしても、ヒット率はそれほど向上しません[8]。通常、他の理由で実行されます(以下の仮想エイリアシングを参照)。一部のCPUは、低電力状態でのキャッシュの関連付けを動的に減らすことができます。これは、省電力手段として機能します。[9]

悪いが単純なものから良いが複雑なものの順に:

  • 直接マップされたキャッシュ–最良の場合は適切ですが、最悪の場合は予測できません
  • 双方向セットの連想キャッシュ
  • 双方向スキューアソシアティブキャッシュ[10]
  • 4方向セットアソシアティブキャッシュ
  • 8ウェイセットアソシアティブキャッシュ、後の実装で一般的な選択
  • 8ウェイと同様の12ウェイセットアソシアティブキャッシュ
  • 完全に関連付けられたキャッシュ–最高のミス率ですが、少数のエントリに対してのみ実用的です

直接マップされたキャッシュ

このキャッシュ構成では、メインメモリ内の各場所はキャッシュ内の1つのエントリにのみ入ることができます。したがって、直接マップされたキャッシュは、「一方向セットアソシアティブ」キャッシュと呼ばれることもあります。どのキャッシュエントリのコンテンツを削除するかを選択できないため、配置ポリシー自体はありません。これは、2つの場所が同じエントリにマップされている場合、それらが継続的に互いにノックアウトする可能性があることを意味します。単純ですが、同等のパフォーマンスを実現するには、直接マップされたキャッシュを連想キャッシュよりもはるかに大きくする必要があり、予測が難しくなります。xをキャッシュ内のブロック番号、yをメモリ内のブロック番号、nをキャッシュ内のブロック数とすると、式x = ymodを使用してマッピングが実行されますn

双方向セット連想キャッシュ

メインメモリ内の各場所をキャッシュ内の2つの場所のいずれかにキャッシュできる場合、1つの論理的な質問は次のとおりです。2つのうちどちらか。上の右側の図に示されている最も単純で最も一般的に使用されるスキームは、メモリ位置のインデックスの最下位ビットをキャッシュメモリのインデックスとして使用し、インデックスごとに2つのエントリを持つことです。このスキームの利点の1つは、キャッシュに格納されているタグに、キャッシュメモリのインデックスによって示されるメインメモリアドレスの部分を含める必要がないことです。キャッシュタグはビット数が少ないため、必要なトランジスタが少なく、プロセッサ回路基板またはマイクロプロセッサチップ上のスペースが少なくて済み、読み取りと比較が高速になります。また、LRUペアごとに1ビットだけを格納する必要があるため、特に単純です。

投機的実行

直接マップされたキャッシュの利点の1つは、単純で高速な推測が可能になることです。アドレスが計算されると、メモリ内のその場所のコピーを持つ可能性のある1つのキャッシュインデックスがわかります。そのキャッシュエントリを読み取ることができ、プロセッサは、タグが実際に要求されたアドレスと一致することを確認し終える前に、そのデータを処理し続けることができます。

タグの一致が完了する前にプロセッサにキャッシュされたデータを使用させるという考え方は、連想キャッシュにも適用できます。ヒントと呼ばれるタグのサブセットを使用して、要求されたアドレスにマッピングされる可能性のあるキャッシュエントリの1つだけを選択できます。ヒントで選択されたエントリは、完全なタグのチェックと並行して使用できます。ヒント手法は、以下で説明するように、アドレス変換のコンテキストで使用する場合に最適に機能します。

双方向スキューアソシアティブキャッシュ

上記のように、ウェイ0のインデックスが直接であるスキューキャッシュ[10]など、他のスキームが提案されていますが、ウェイ1のインデックスはハッシュ関数で形成されます。優れたハッシュ関数には、直接マッピングと競合するアドレスがハッシュ関数とマッピングされたときに競合しない傾向があるという特性があるため、病理学的アクセスが原因でプログラムが予期せず多数の競合ミスに見舞われる可能性が低くなります。パターン。欠点は、ハッシュ関数の計算による余分な遅延です。[11]さらに、新しい行をロードして古い行を削除するときは、新しい行がそれぞれの方法で異なるインデックスのデータと競合するため、どの既存の行が最も最近使用されたかを判断するのが難しい場合があります。スキューされていないキャッシュのLRU追跡は、通常、セットごとに実行されます。それにもかかわらず、スキューアソシアティブキャッシュには、従来のセットアソシアティブキャッシュに比べて大きな利点があります。[12]

疑似連想キャッシュ

真のセットアソシアティブキャッシュは、連想メモリのようなものを使用して、考えられるすべての方法を同時にテストします疑似連想キャッシュは、可能な方法を1つずつテストします。ハッシュ再ハッシュキャッシュと列連想キャッシュは、疑似連想キャッシュの例です。

テストされた最初の方法でヒットを見つける一般的なケースでは、疑似関連付けキャッシュは直接マップされたキャッシュと同じくらい高速ですが、直接マップされたキャッシュよりも競合ミス率がはるかに低く、ミス率に近くなります完全に関連付けられたキャッシュの。 [11]

キャッシュエントリ構造

キャッシュ行エントリは通常、次の構造になっています。

鬼ごっこ データブロック フラグビット

データブロック(キャッシュライン)には、メインメモリからフェッチされた実際のデータが含まれていますタグには、メインメモリからフェッチされた実際のデータのアドレス(の一部)が含まれていますフラグビットについては、以下で説明します

キャッシュの「サイズ」は、キャッシュが保持できるメインメモリデータの量です。このサイズは、各データブロックに格納されているバイト数にキャッシュに格納されているブロック数を掛けたものとして計算できます。(タグ、フラグ、およびエラー訂正コードのビットは、キャッシュの物理領域に影響を与えますが 、サイズには含まれていません[13] 。)

キャッシュライン(メモリブロック)に沿った実効メモリアドレスは、タグ、インデックス、およびブロックオフセットに分割されます( MSBからLSB )。[14] [15]

鬼ごっこ 索引 ブロックオフセット

インデックスは、データが挿入されたキャッシュセットを示します。インデックスの長さは次のとおりです。sキャッシュセット のビット。

ブロックオフセットは、キャッシュ行内の保存されたデータブロック内の目的のデータを指定します。通常、実効アドレスはバイト単位であるため、ブロックオフセット長は次のようになります。ビット。ここで、bはデータブロックあたりのバイト数です。タグにはアドレスの最上位ビットが含まれ、現在のセット(セットはインデックスによって取得されています)のすべての行に対してチェックされ、このセットに要求されたアドレスが含まれているかどうかが確認されます。含まれている場合、キャッシュヒットが発生します。ビット単位のタグの長さは次のとおりです。

tag_length = address_length - index_length - block_offset_length

一部の作成者は、ブロックオフセットを単に「オフセット」[16]または「変位」と呼んでいます。[17] [18]

オリジナルのPentium4プロセッサには、64バイトのキャッシュブロックを備えた、サイズが8KiBの4ウェイセットの連想L1データキャッシュがあり ました。したがって、8 KiB / 64 = 128キャッシュブロックがあります。セットの数は、キャッシュブロックの数を結合方法の数で割ったものに等しく、128/4 = 32セット、つまり2 5  = 32の異なるインデックスになります。2 6  = 64の可能なオフセットがあります。CPUアドレスは32ビット幅であるため、これはタグフィールドの32-5-6 = 21ビットを意味します。

オリジナルのPentium4プロセッサには、サイズが256 KiBで、128バイトのキャッシュブロックを備えた8ウェイセットのアソシアティブL2統合キャッシュもありました。これは、タグフィールドの32-8-7 = 17ビットを意味します。[16]

フラグビット

命令キャッシュには、キャッシュ行エントリごとに1つのフラグビット(有効ビット)のみが必要です。有効ビットは、キャッシュブロックに有効なデータがロードされているかどうかを示します。

電源投入時に、ハードウェアはすべてのキャッシュのすべての有効なビットを「無効」に設定します。一部のシステムは、あるプロセッサのキャッシュ内のマルチマスターバススヌーピングハードウェアが他のプロセッサからブロードキャストされたアドレスを聞き、ローカルキャッシュ内の特定のデータブロックが現在は古くなっており、無効とマークする必要があります。

データキャッシュには通常、キャッシュラインごとに有効ビットとダーティビットの2つのフラグビットが必要です。ダーティビットが設定されている場合は、メインメモリから読み取られてから関連するキャッシュラインが変更されていることを示します(「ダーティ」)。つまり、プロセッサがそのラインにデータを書き込み、新しい値がメインメモリに伝播されていないことを意味します。 。

キャッシュミス

キャッシュミスとは、キャッシュ内のデータの読み取りまたは書き込みに失敗したことであり、その結果、メインメモリへのアクセスがはるかに長くなります。キャッシュミスには、命令読み取りミス、データ読み取りミス、データ書き込みミスの3種類があります。

プロセッサ、または少なくとも実行スレッドは、命令がメインメモリからフェッチされるまで待機(ストール)する 必要があるため、命令キャッシュからのキャッシュ読み取りミスは、一般に最大の遅延を引き起こします。キャッシュ読み取りに依存しない命令を発行して、データがメインメモリから返されるまで実行を継続し、依存する命令が実行を再開できるため 、データキャッシュからのキャッシュ読み取りミスは通常、遅延が小さくなります。データへのキャッシュ書き込みミス書き込みをキューに入れることができ、後続の命令の実行にほとんど制限がないため、キャッシュは一般に最短の遅延を引き起こします。プロセッサは、キューがいっぱいになるまで続行できます。ミスのタイプの詳細については、キャッシュパフォーマンスの測定とメトリックを参照してください。

アドレス変換

ほとんどの汎用CPUは、何らかの形式の仮想メモリを実装しています。要約すると、マシンで実行されている各プログラムは、そのプログラムのコードとデータのみを含む独自の簡略化されたアドレススペースを参照するか、すべてのプログラムが共通の仮想アドレススペースで実行されます。プログラムは、物理アドレス空間のアドレスではなく、仮想アドレス空間のアドレスを計算、比較、読み取り、および書き込むことによって実行されるため、プログラムがより単純になり、書き込みが容易になります。

仮想メモリでは、プロセッサがプログラムによって生成された仮想アドレスをメインメモリの物理アドレスに変換する必要があります。この変換を行うプロセッサの部分は、メモリ管理ユニット(MMU)と呼ばれます。MMUを介した高速パスは、オペレーティングシステムのページテーブル、セグメントテーブル、またはその両方 からのマッピングのキャッシュであるトランスレーションルックアサイドバッファ(TLB)に格納されている変換を実行できます。

現在の議論の目的のために、アドレス変換の3つの重要な機能があります:

  • レイテンシー:物理アドレスは、仮想アドレスがアドレスジェネレーターから利用可能になった後、しばらくの間、おそらく数サイクルでMMUから利用可能になります。
  • エイリアシング:複数の仮想アドレスを単一の物理アドレスにマップできます。ほとんどのプロセッサは、その単一の物理アドレスへのすべての更新がプログラム順に行われることを保証します。その保証を実現するには、プロセッサは常に物理アドレスのコピーが1つだけキャッシュに存在することを確認する必要があります。
  • 粒度:仮想アドレス空間はページに分割されます。たとえば、4  GiBの仮想アドレス空間は、4 KiBサイズの1,048,576ページに分割され、それぞれを個別にマッピングできます。複数のページサイズがサポートされている場合があります。詳細については、仮想メモリを参照してください。

一部の初期の仮想メモリシステムは、プログラムされたメインメモリへのアクセスの前にページテーブル(メインメモリに保持されている)へのアクセスを必要としたため、非常に低速でした。[注1]キャッシュがない場合、これによりメモリアクセスの速度が実質的に半分になります。コンピュータシステムで使用された最初のハードウェアキャッシュは、実際にはデータまたは命令キャッシュではなく、TLBでした。[20]

キャッシュは、インデックスまたはタグが物理アドレスまたは仮想アドレスのどちらに対応するかに基づいて、4つのタイプに分類できます。

  • 物理的にインデックス付けされ、物理的にタグ付けされた(PIPT)キャッシュは、インデックスとタグの両方に物理アドレスを使用します。これは単純でエイリアシングの問題を回避しますが、物理アドレスをキャッシュで検索する前に物理アドレスを検索する必要があるため(TLBミスとメインメモリへのアクセスが含まれる可能性があります)、速度も遅くなります。
  • 仮想インデックス、仮想タグ(VIVT)キャッシュは、インデックスとタグの両方に仮想アドレスを使用します。このキャッシングスキームでは、特定の仮想アドレスの物理アドレスを決定するためにMMUを最初に参照する必要がないため、ルックアップがはるかに高速になります。ただし、VIVTにはエイリアシングの問題があり、複数の異なる仮想アドレスが同じ物理アドレスを参照する場合があります。その結果、同じメモリを参照しているにもかかわらず、そのようなアドレスは別々にキャッシュされ、コヒーレンシの問題が発生します。この問題の解決策は存在しますが[21]これらは、標準のコヒーレンスプロトコルでは機能しません。もう1つの問題は同音異義語で、同じ仮想アドレスが複数の異なる物理アドレスにマップされます。仮想インデックス自体を確認するだけでは、これらのマッピングを区別することはできませんが、考えられる解決策には、コンテキストスイッチ後のキャッシュのフラッシュ、アドレススペースの非オーバーラップの強制、仮想アドレスのアドレススペースID(ASID)のタグ付けなどがあります。 )。さらに、仮想から物理へのマッピングが変更される可能性があるという問題があります。これには、VAが無効になるため、キャッシュラインのフラッシュが必要になります。タグが物理アドレス(VIPT)を使用している場合、これらの問題はすべて発生しません。
  • 仮想的に索引付けされ、物理的にタグ付けされている(VIPT)キャッシュは、インデックスの仮想アドレスとタグの物理アドレスを使用します。キャッシュラインはTLB変換と並行してルックアップできるため、PIPTに対する利点はレイテンシが低いことですが、物理アドレスが使用可能になるまでタグを比較することはできません。VIVTに対する利点は、タグに物理アドレスがあるため、キャッシュが同音異義語を検出できることです。理論的には、VIPTはより多くのタグビットを必要とします。これは、一部のインデックスビットが仮想アドレスと物理アドレスで異なる可能性があり(たとえば、4 KiBページのビット12以上)、仮想インデックスと物理タグの両方に含める必要があるためです。コヒーレンシの問題を回避するために、VIPTキャッシュはそのようなインデックスビットを持たないように設計されているため、実際にはこれは問題ではありません(たとえば、インデックスとブロックオフセットの合計ビット数を4KiBページで12に制限する。これにより、VIPTキャッシュのサイズが、ページサイズにキャッシュの結合性を掛けたものに制限されます。
  • 物理的にインデックス付けされ、仮想的にタグ付けされた(PIVT)キャッシュは、多くの場合、文献では役に立たず、存在しないと主張されています。[22] ただし、MIPS R6000は、このキャッシュタイプを唯一の既知の実装として使用します。[23] R6000はエミッタ結合論理で実装されています。これは、 TLBなどの大容量メモリには適さない非常に高速なテクノロジです。R6000は、TLBメモリをチップ上に小さな高速TLB「スライス」を持つ第2レベルのキャッシュの予約済み部分に配置することで問題を解決します。キャッシュは、TLBスライスから取得した物理アドレスによってインデックスが付けられます。ただし、TLBスライスは、キャッシュのインデックス作成に必要な仮想アドレスビットのみを変換し、タグを使用しないため、誤ったキャッシュヒットが発生する可能性があります。これは、仮想アドレスでタグ付けすることで解決されます。

この繰り返しの速度(ロードレイテンシ)はCPUパフォーマンスにとって重要であるため、最新のレベル1キャッシュのほとんどは仮想的にインデックス付けされており、少なくともMMUのTLBルックアップをキャッシュRAMからのデータのフェッチと並行して進めることができます。

ただし、仮想インデックスは、すべてのキャッシュレベルに最適な選択ではありません。仮想エイリアスを処理するコストはキャッシュサイズとともに増加し、その結果、ほとんどのレベル2以上のキャッシュは物理的にインデックス付けされます。

キャッシュはこれまで、キャッシュタグに仮想アドレスと物理アドレスの両方を使用してきましたが、仮想タグ付けは現在では一般的ではありません。TLBルックアップがキャッシュRAMルックアップの前に終了できる場合、物理アドレスはタグ比較に間に合うように使用可能であり、仮想タグ付けは必要ありません。したがって、大きなキャッシュは物理的にタグ付けされる傾向があり、仮想的にタグ付けされるのは、小さくて非常に低遅延のキャッシュのみです。最近の汎用CPUでは、以下に説明するように、仮想タグ付けがvhintsに取って代わられています。

同音異義語と同義語の問題

仮想インデックスとタグ付けに依存するキャッシュは、同じ仮想アドレスが異なる物理アドレス(ホモニム)にマップされた後、一貫性がなくなります。これは、タグ付けに物理アドレスを使用するか、キャッシュラインにアドレス空間識別子を格納することで解決できます。ただし、後者のアプローチは、複数のキャッシュラインが同じ物理アドレスのデータを格納するという同義語の問題には役立ちません。このような場所に書き込むと、キャッシュ内の1つの場所のみが更新され、他の場所には一貫性のないデータが残る可能性があります。この問題は、異なるアドレス空間に重複しないメモリレイアウトを使用することで解決できる場合があります。そうでない場合は、マッピングが変更されたときにキャッシュ(またはその一部)をフラッシュする必要があります。[24]

仮想タグとvhints

仮想タグの大きな利点は、連想キャッシュの場合、仮想から物理への変換が行われる前にタグの一致を続行できることです。ただし、コヒーレンスプローブとエビクションは、アクションの物理アドレスを示します。ハードウェアには、通常、物理タグと仮想タグを格納することにより、物理アドレスをキャッシュインデックスに変換する何らかの手段が必要です。比較のために、物理的にタグ付けされたキャッシュは仮想タグを保持する必要がないため、より簡単です。仮想から物理へのマッピングがTLBから削除されると、それらの仮想アドレスを持つキャッシュエントリを何らかの方法でフラッシュする必要があります。または、TLBによってマップされていないページでキャッシュエントリが許可されている場合、それらのページのアクセス権がページテーブルで変更されたときに、それらのエントリをフラッシュする必要があります。

オペレーティングシステムが、仮想エイリアスがキャッシュに同時に存在しないようにすることも可能です。オペレーティングシステムは、以下で説明するページの色付けを適用することにより、この保証を行います。一部の初期のRISCプロセッサ(SPARC、RS / 6000)は、このアプローチを採用していました。仮想エイリアスを検出して削除するためのハードウェアコストが下がり、完全なページカラーリングのソフトウェアの複雑さとパフォーマンスの低下が高まったため、最近は使用されていません。

連想キャッシュ内のタグの2つの機能を区別すると便利です。これらは、エントリセットのどちらの方向を選択するかを決定するために使用され、キャッシュがヒットしたか失敗したかを決定するために使用されます。2番目の関数は常に正しい必要がありますが、最初の関数が推測して、ときどき間違った答えを取得することは許容されます。

一部のプロセッサ(初期のSPARCなど)には、仮想タグと物理タグの両方を備えたキャッシュがあります。仮想タグはウェイの選択に使用され、物理タグはヒットまたはミスの決定に使用されます。この種のキャッシュは、仮想的にタグ付けされたキャッシュの遅延の利点と、物理的にタグ付けされたキャッシュのシンプルなソフトウェアインターフェイスを利用します。ただし、重複したタグの追加コストは負担します。また、ミス処理中に、インデックス付けされたキャッシュラインの代替方法で仮想エイリアスをプローブし、一致するものを削除する必要があります。

余分な領域(およびある程度の遅延)は、仮想タグの代わりに各キャッシュエントリに仮想ヒントを保持することで軽減できます。これらのヒントは、仮想タグのサブセットまたはハッシュであり、データと物理タグを取得するキャッシュの方法を選択するために使用されます。仮想タグ付きキャッシュと同様に、仮想ヒントの一致はあるが物理タグの不一致がある場合があります。その場合、このアドレスでのキャッシュフィル後のキャッシュアクセスでヒントが1つだけ一致するように、一致するヒントを持つキャッシュエントリを削除する必要があります。仮想ヒントは、仮想タグよりもビット数が少ないため、仮想ヒントキャッシュは、仮想タグ付きキャッシュよりも多くの競合ミスが発生します。

おそらく、仮想ヒントの究極の削減は、Pentium 4(WillametteおよびNorthwoodコア)で見つけることができます。これらのプロセッサでは、仮想ヒントは事実上2ビットであり、キャッシュは4方向に関連付けられています。事実上、ハードウェアは仮想アドレスからキャッシュインデックスへの単純な順列を維持するため、フェッチされる4つの方法のいずれかを適切に選択するために 連想メモリ(CAM)は必要ありません。

ページの色付け

物理的にインデックス付けされた大規模なキャッシュ(通常はセカンダリキャッシュ)で問題が発生します。アプリケーションではなくオペレーティングシステムが、キャッシュ内で互いに衝突するページを制御します。プログラムの実行ごとのページ割り当ての違いは、キャッシュの衝突パターンの違いにつながり、プログラムのパフォーマンスに非常に大きな違いをもたらす可能性があります。これらの違いにより、ベンチマーク実行の一貫した繰り返し可能なタイミングを取得することが非常に困難になる可能性があります。

この問題を理解するために、1MiBの物理的にインデックス付けされた直接マップされたレベル2キャッシュと4KiBの仮想メモリページを備えたCPUについて考えてみます。シーケンシャル物理ページは、256ページ後にパターンがラップアラウンドするまで、キャッシュ内のシーケンシャルロケーションにマップされます。各物理ページに0〜255の色でラベルを付けて、キャッシュ内のどこに移動できるかを示すことができます。異なる色の物理ページ内の場所は、キャッシュ内で競合することはできません。

キャッシュを最大限に活用しようとするプログラマーは、プログラムのアクセスパターンを調整して、常に1 MiBのデータのみをキャッシュする必要があるため、容量のミスを回避できます。ただし、アクセスパターンに競合ミスがないことも確認する必要があります。この問題を考える1つの方法は、プログラムが使用する仮想ページを分割し、以前に物理ページに物理色が割り当てられていたのと同じ方法で仮想色を割り当てることです。次に、プログラマーは、同じ仮想色の2つのページが同時に使用されないように、コードのアクセスパターンを調整できます。このような最適化(ループネストの最適化など)に関する幅広い文献があり、主にハイパフォーマンスコンピューティング(HPC)コミュニティから提供されています。

問題は、ある時点で使用されているすべてのページの仮想色が異なる場合でも、物理的な色が同じである場合もあるということです。実際、オペレーティングシステムが物理ページを仮想ページにランダムかつ均一に割り当てる場合、一部のページが同じ物理色を持ち、それらのページの場所がキャッシュ内で衝突する可能性が非常に高くなります(これは誕生日のパラドックスです)。

解決策は、オペレーティングシステムに、異なる物理カラーページを異なる仮想カラーに割り当てようとすることです。これはページカラーリングと呼ばれる手法です。仮想色から物理色への実際のマッピングはシステムパフォーマンスとは無関係ですが、奇数のマッピングは追跡が難しく、ほとんどメリットがないため、ページの色付けに対するほとんどのアプローチは、物理ページと仮想ページの色を同じに保とうとします。

オペレーティングシステムが各物理ページが1つの仮想カラーのみにマップされることを保証できる場合、仮想エイリアスは存在せず、プロセッサは、ミス処理中に追加の仮想エイリアスプローブを必要とせずに、仮想インデックス付きキャッシュを使用できます。または、OSは、ある仮想色から別の仮想色に変更されるたびに、キャッシュからページをフラッシュできます。上記のように、このアプローチは一部の初期のSPARCおよびRS / 6000設計に使用されていました。

最新のプロセッサのキャッシュ階層

AMDBulldozerサーバーのメモリ階層

最新のプロセッサには、相互作用する複数のオンチップキャッシュがあります。特定のキャッシュの動作は、キャッシュサイズ、キャッシュブロックサイズ、セット内のブロック数、キャッシュセット置換ポリシー、およびキャッシュ書き込みポリシー(ライトスルーまたはライトバック)によって完全に指定できます。[16]

特定のキャッシュ内のすべてのキャッシュブロックは同じサイズであり、同じ結合性を持っていますが、通常、「低レベル」キャッシュ(レベル1キャッシュと呼ばれる)は、ブロック数が少なく、ブロックサイズが小さく、ブロック数が少なくなります。設定されていますが、アクセス時間が非常に短いです。「高レベル」キャッシュ(つまり、レベル2以上)は、ブロック数が次第に大きくなり、ブロックサイズが大きくなり、セット内のブロック数が多くなり、アクセス時間が比較的長くなりますが、メインメモリよりもはるかに高速です。

キャッシュエントリの置換ポリシーは、プロセッサ設計者が実装するために選択したキャッシュアルゴリズムによって決定されます。場合によっては、さまざまな種類の作業負荷に対して複数のアルゴリズムが提供されます。

専用キャッシュ

パイプライン化されたCPUは、パイプライン内の複数のポイント(命令フェッチ、仮想アドレスから物理アドレスへの変換、およびデータフェッチ)からメモリにアクセスします(従来のRISCパイプラインを参照)。自然な設計では、これらのポイントごとに異なる物理キャッシュを使用するため、パイプラインの2つのポイントにサービスを提供するために1つの物理リソースをスケジュールする必要はありません。したがって、パイプラインは当然、それぞれが特定の役割に特化した、少なくとも3つの個別のキャッシュ(命令、TLB、およびデータ)で終了します。

被害者キャッシュ

ビクティムキャッシュは、交換時にCPUキャッシュから削除されたブロックを保持するために使用されるキャッシュですビクティムキャッシュはメインキャッシュとそのリフィルパスの間にあり、メインキャッシュから削除されたデータのブロックのみを保持します。被害者のキャッシュは通常、完全に関連付けられており、競合ミスの数を減らすことを目的としています。一般的に使用されるプログラムの多くは、すべてのアクセスに対して連想マッピングを必要としません。実際、プログラムのメモリアクセスのごく一部だけが高い関連性を必要とします。ビクティムキャッシュは、これらのアクセスのみに高い関連付けを提供することにより、このプロパティを悪用します。1990年にDECからノーマンジュッピによって導入されました。 [25]

IntelのHaswellプロセッサのCrystalwell [26]バリアントは、プロセッサのレベル3キャッシュの犠牲キャッシュとして機能するオンパッケージ128 MBeDRAMレベル4キャッシュを導入しました[27] Skylakeマイクロアーキテクチャでは、レベル4キャッシュは犠牲キャッシュとして機能しなくなりました。[28]

トレースキャッシュ

キャッシュの特殊化のより極端な例の1つは、 Intel Pentium 4マイクロプロセッサにあるトレースキャッシュ(実行トレースキャッシュとも呼ばれますです。トレースキャッシュは、すでにフェッチおよびデコードされた命令のトレースを保存することにより、命令フェッチ帯域幅を増やし、消費電力を減らすためのメカニズムです(Pentium 4の場合) 。[29]

トレースキャッシュは、デコードされた後、またはリタイアされたときに命令を格納します。通常、命令は、個々の基本ブロックまたは動的命令トレースのいずれかを表すグループのトレースキャッシュに追加されます。Pentium 4のトレースキャッシュは、x86命令のデコードから生じるマイクロオペレーションを格納し、マイクロオペレーションキャッシュの機能も提供します。これにより、次に命令が必要になったときに、マイクロオペレーションに再度デコードする必要がなくなります。[30] :63–68 

Coalescing Cache(WCC)の書き込み

Write Coalescing Cache [31]は、 AMDBulldozerマイクロアーキテクチャのL2キャッシュの一部である特別なキャッシュですモジュール内の両方のL1Dキャッシュからのストアは、WCCを通過し、そこでバッファリングおよび合体されます。WCCのタスクは、L2キャッシュへの書き込み回数を減らすことです。

マイクロオペレーション(μopまたはuop)キャッシュ

マイクロオペレーションキャッシュ( μopキャッシュuopキャッシュまたはUC[32]は、命令デコーダーまたは命令キャッシュから直接受信した、デコードされた命令のマイクロオペレーションを格納する特殊なキャッシュです。命令をデコードする必要がある場合、μopキャッシュは、キャッシュされている場合に再利用されるデコードされた形式についてチェックされます。使用できない場合、命令はデコードされてからキャッシュされます。

Intel P6プロセッサフ​​ァミリの代替フロントエンドとしてμopキャッシュを説明した初期の作品の1つは、2001年の論文「Micro-OperationCache:可変命令長ISA用のパワーアウェアフロントエンド」です。[33]その後、IntelはSandy Bridgeプロセッサと、 IvyBridgeHaswellなどの連続するマイクロアーキテクチャにμopキャッシュを組み込みました。[30] :121–123  [34] AMDは、Zenマイクロアーキテクチャにμopキャッシュを実装しました。[35]

事前にデコードされた完全な命令をフェッチすると、可変長の複雑な命令を繰り返しデコードして、より単純な固定長のマイクロオペレーションにする必要がなくなり、フェッチされた命令の予測、フェッチ、ローテーション、および整列のプロセスが簡素化されます。μopキャッシュは、フェッチおよびデコードハードウェアを効果的にオフロードするため、消費電力が削減され、デコードされたマイクロオペレーションのフロントエンド供給が向上します。μopキャッシュは、デコードされたマイクロオペレーションをバックエンドにより一貫して提供し、CPUのフェッチおよびデコードロジックのさまざまなボトルネックを排除することにより、パフォーマンスも向上させます。[33] [34]

μopキャッシュはトレースキャッシュと多くの類似点がありますが、μopキャッシュははるかに単純であるため、電力効率が向上します。これにより、バッテリ駆動のデバイスでの実装により適しています。電力効率の低下につながるトレースキャッシュの主な欠点は、動的に作成された命令トレースのキャッシュと再利用をヒューリスティックに決定するために必要なハードウェアの複雑さです。[36]

分岐ターゲット命令キャッシュ

ARMマイクロプロセッサ使用される名前である分岐ターゲットキャッシュまたは分岐ターゲット命令キャッシュ[37]は、分岐先で最初のいくつかの命令を保持する特殊なキャッシュです。これは、メモリシステムが命令キャッシュなしでCPUを満たすのに十分な速度で命令を配信できるため、通常の命令キャッシュを必要としない低電力プロセッサで使用されます。ただし、これは順番に連続する命令にのみ適用されます。新しいアドレスで命令フェッチを再開するには、まだ数サイクルのレイテンシが必要であり、制御転送後にパイプラインストールが数サイクル発生します。分岐ターゲットキャッシュは、ほとんどの分岐後の遅延を回避するために、これらの数サイクルの命令を提供します。

これにより、従来のフルタイムの命令キャッシュよりもはるかに小さいキャッシュでフルスピードの操作が可能になります。

スマートキャッシュ

スマートキャッシュは、Intelによって開発された複数の実行コア用のレベル2またはレベル3のキャッシュ方法です。

スマートキャッシュは、マルチコアプロセッサのコア間で実際のキャッシュメモリを共有します専用のコアごとのキャッシュと比較して、すべてのコアがキャッシュスペースの等しい部分を必要としない場合、全体的なキャッシュミス率は減少します。したがって、他のコアが非アクティブである場合、単一のコアは完全なレベル2またはレベル3のキャッシュを使用できます。[38]さらに、共有キャッシュにより、異なる実行コア間でメモリを共有することがより高速になります。[39]

マルチレベルキャッシュ

もう1つの問題は、キャッシュレイテンシとヒット率の間の基本的なトレードオフです。キャッシュが大きいほどヒット率は高くなりますが、レイテンシは長くなります。このトレードオフに対処するために、多くのコンピューターは複数レベルのキャッシュを使用し、小さい高速キャッシュは大きくて遅いキャッシュによってバックアップされます。マルチレベルキャッシュは通常、最速のレベル1L1)キャッシュを最初にチェックすることによって動作します。ヒットした場合、プロセッサは高速で進行します。その小さいキャッシュが失われると、外部メモリにアクセスする前に 、次に速いキャッシュ(レベル2L2 )がチェックされます。

メインメモリと最速のキャッシュのレイテンシの差が大きくなるにつれて、一部のプロセッサは3レベルものオンチップキャッシュを利用し始めています。価格に敏感な設計では、これを使用してキャッシュ階層全体をオンチップでプルしていましたが、2010年代までに、最高パフォーマンスの設計の一部は、 eDRAMに実装され、マルチチップモジュールにマウントされることが多い大規模なオフチップキャッシュに戻りました。、4番目のキャッシュレベルとして。メインフレームCPUIBM z15 (2019)などのまれなケースでは、L1までのすべてのレベルがeDRAMによって実装され、SRAMが完全に置き換えられます(キャッシュの場合、SRAMは引き続きレジスタに使用されます)。ARMベース AppleM14つの高性能コアのそれぞれに192KBのL1キャッシュがあり、非常に大量です。ただし、4つの高効率コアには128KBしかありません。

L3およびL4キャッシュの利点は、アプリケーションのアクセスパターンによって異なります。L3およびL4キャッシュを組み込んだ製品の例には、次のものがあります。

  • Alpha 21164(1995)には、1〜64MBのオフチップL3キャッシュがあります。
  • IBM POWER4(2001)には、プロセッサーあたり32 MBのオフチップL3キャッシュがあり、複数のプロセッサー間で共有されます。
  • Itanium 2(2003)には、6 MBの統合レベル3(L3)キャッシュオンダイがあります。Itanium 2 (2003)MX 2モジュールは、 2つのItanium 2プロセッサと、Madisonプロセッサとピン互換のマルチチップモジュール上の共有64 MBL4キャッシュを組み込んでいます。
  • 「Tulsa」(2006)というコードネームのIntelのXeon MP製品は、2つのプロセッサコア間で共有される16MBのオンダイL3キャッシュを備えています。
  • AMD Phenom II(2008)には、最大6MBのオンダイ統合L3キャッシュがあります。
  • Intel Core i7(2008)には、すべてのコアで共有される8MBのオンダイ統合L3キャッシュがあります。
  • Intel IrisProグラフィックスが統合されたIntelHaswell CPUには、基本的にL4キャッシュとして機能する128MBのeDRAMが搭載されています。[40]

最後に、メモリ階層のもう一方の端では、CPUレジスタファイル自体がシステム内で最小かつ最速のキャッシュと見なすことができます。これは、レジスタを保持するためにレジスタを割り当てるため、ソフトウェアでスケジュールされるという特別な特性があります。例として、ループネスト最適化のためにメインメモリから取得された値。ただし、レジスタの名前を変更すると、ほとんどのコンパイラレジスタの割り当てが実行時にハードウェアによってレジスタバンクに動的に再割り当てされるため、CPUは誤ったデータ依存関係を解消し、パイプラインの危険性を軽減できます。

レジスタファイルにも階層がある場合があります。Cray-1(1976年頃)には、8つのアドレス「A」と8つのスカラーデータ「S」レジスタがあり、これらは一般的に使用可能でした。また、64個のアドレス「B」と64個のスカラーデータ「T」レジスタのセットがあり、アクセスに時間がかかりましたが、メインメモリよりも高速でした。「B」および「T」レジスタは、Cray-1にデータキャッシュがなかったために提供されました。(ただし、Cray-1には命令キャッシュがありました。)

マルチコアチップ

複数のコアを備えたチップを検討する場合、キャッシュを共有するか、各コアに対してローカルにするかという問題があります。共有キャッシュを実装すると、必然的に配線と複雑さが増します。ただし、コアではなくチップごとに1つのキャッシュを使用すると、必要なスペースの量が大幅に削減されるため、より大きなキャッシュを含めることができます。

通常、L1キャッシュを共有することは望ましくありません。これは、結果としてレイテンシが増加すると、各コアの実行がシングルコアチップよりもかなり遅くなるためです。ただし、メモリにアクセスする前に最後に呼び出される最高レベルのキャッシュの場合、単一のコアでキャッシュ全体を使用できるようにする、さまざまなプロセスを可能にすることでデータの冗長性を減らすなど、いくつかの理由でグローバルキャッシュを使用することが望ましいです。キャッシュされたデータを共有するスレッド、および利用されるキャッシュコヒーレンシプロトコルの複雑さを軽減します。[41] たとえば、3つのレベルを持つ8コアチップには、コアごとにL1キャッシュ、コアのペアごとに1つの中間L2キャッシュ、およびすべてのコア間で共有される1つのL3キャッシュが含まれる場合があります。

メモリにアクセスする前に呼び出される共有の最上位キャッシュは、通常、最終レベルキャッシュ(LLC)と呼ばれます。LLCが複数のコア間で共有される場合、特定の範囲のメモリアドレスをアドレス指定し、独立してアクセスできる複数のピースにスライスするなど、並列処理のレベルを上げるために追加の手法が使用されます。[42]

分離対統一

別のキャッシュ構造では、命令とデータは別々にキャッシュされます。つまり、キャッシュラインは、命令またはデータのいずれかをキャッシュするために使用されますが、両方をキャッシュするためには使用されません。個別のデータおよび命令変換ルックアサイドバッファを使用すると、さまざまな利点が実証されています。[43] 統一された構造では、この制約は存在せず、キャッシュラインを使用して命令とデータの両方をキャッシュできます。

排他的対包括的

マルチレベルキャッシュは、新しい設計上の決定をもたらします。たとえば、一部のプロセッサでは、L1キャッシュ内のすべてのデータもL2キャッシュ内のどこかにある必要があります。これらのキャッシュは厳密に包括的と呼ばれます。他のプロセッサ(AMD Athlonなど)には専用キャッシュがあります。データは、L1キャッシュとL2キャッシュの両方ではなく、最大で1つにあることが保証されています。さらに他のプロセッサ(Intel Pentium IIIII、および4など)では、L1キャッシュ内のデータもL2キャッシュ内に存在する必要はありませんが、多くの場合、存在する可能性があります。この中間ポリシーには、広く受け入れられている名前はありません。[44] [45] 2つの一般的な名前は「非排他的」と「部分的に包括的」です。

排他的キャッシュの利点は、より多くのデータを格納できることです。この利点は、排他的L1キャッシュがL2キャッシュに匹敵する場合に大きくなり、L2キャッシュがL1キャッシュよりも何倍も大きい場合に減少します。L1がミスし、L2がアクセスにヒットすると、L2のヒットキャッシュラインがL1のラインと交換されます。この交換は、L2からL1に行をコピーするよりもかなり多くの作業が必要です。これは、包括的キャッシュが行うことです。[45]

厳密に包括的キャッシュの利点の1つは、マルチプロセッサシステム内の外部デバイスまたは他のプロセッサがプロセッサからキャッシュラインを削除したい場合、プロセッサにL2キャッシュをチェックさせるだけでよいことです。包含を強制しないキャッシュ階層では、L1キャッシュもチェックする必要があります。欠点として、L1キャッシュとL2キャッシュの関連付けには相関関係があります。L2キャッシュに少なくともすべてのL1キャッシュと同じ数の方法がない場合、L1キャッシュの有効な関連付けが制限されます。包括的キャッシュのもう1つの欠点は、L2キャッシュに削除がある場合は常に、包括性を維持するためにL1の(場合によっては)対応する行も削除する必要があることです。これはかなりの作業であり、L1ミス率が高くなります。[45]

インクルーシブキャッシュのもう1つの利点は、キャッシュが大きいほど大きなキャッシュラインを使用できることです。これにより、セカンダリキャッシュタグのサイズが小さくなります。(排他的キャッシュでは、両方のキャッシュに同じサイズのキャッシュラインが必要です。これにより、L1ミス、L2ヒット時にキャッシュラインを交換できます。)セカンダリキャッシュがプライマリキャッシュよりも1桁大きく、キャッシュデータがキャッシュタグよりも1桁大きいため、節約されるこのタグ領域は、L1キャッシュデータをL2に格納するために必要な増分領域に匹敵する可能性があります。[46]

スクラッチパッドメモリ

スクラッチパッドメモリ(SPM)は、スクラッチパッド、スクラッチパッドRAM、またはコンピュータ用語ではローカルストアとも呼ばれ、計算、データ、およびその他の進行中の作業を一時的に保存するために使用される高速内部メモリです。

例:K8

特殊化とマルチレベルキャッシングの両方を説明するために、AMD Athlon 64CPUのK8コアのキャッシュ階層を次に示します。[47]

AMD Athlon 64CPUのK8コアのキャッシュ階層。

K8には、命令キャッシュ、命令TLB、データTLB、およびデータキャッシュの4つの専用キャッシュがあります。これらの各キャッシュは特殊化されています。

  • 命令キャッシュは、64バイトのメモリラインのコピーを保持し、各サイクルで16バイトをフェッチします。このキャッシュの各バイトは8ビットではなく10ビットで格納され、余分なビットは命令の境界を示します(これはプリデコードの例です)。キャッシュにはECCではなくパリティ保護のみがあります。これは、パリティが小さく、損傷したデータをメモリからフェッチされた新しいデータ(常に最新の命令コピーがある)に置き換えることができるためです。
  • 命令TLBは、ページテーブルエントリ(PTE)のコピーを保持します。各サイクルの命令フェッチでは、仮想アドレスがこのTLBを介して物理アドレスに変換されます。各エントリは、メモリ内で4バイトまたは8バイトのいずれかです。K8のページサイズは可変であるため、各TLBは2つのセクションに分割されます。1つは4 KBページをマップするPTEを保持し、もう1つは4MBまたは2MBページをマップするPTEを保持します。分割により、各セクションの完全に関連付けられた一致回路がより単純になります。オペレーティングシステムは、仮想アドレス空間のさまざまなセクションをさまざまなサイズのPTEでマップします。
  • データTLBには、同一のエントリを保持する2つのコピーがあります。2つのコピーにより、サイクルごとに2つのデータアクセスが可能になり、仮想アドレスを物理アドレスに変換できます。命令TLBと同様に、このTLBは2種類のエントリに分割されます。
  • データキャッシュは、64バイトのメモリラインのコピーを保持します。これは8つのバンクに分割され(それぞれが8 KBのデータを格納します)、それらのデータが異なるバンクにある限り、各サイクルで2つの8バイトのデータをフェッチできます。各64バイト行が8つのバンクすべてに分散しているため、タグのコピーは2つあります。各タグコピーは、サイクルごとに2つのアクセスのうちの1つを処理します。

K8には複数レベルのキャッシュもあります。4KBをマッピングするPTEのみを格納する第2レベルの命令およびデータTLBがあります。命令キャッシュとデータキャッシュの両方、およびさまざまなTLBは、大規模な統合L2キャッシュから埋めることができます。このキャッシュは、L1命令キャッシュとデータキャッシュの両方に排他的です。つまり、8バイトの回線は、L1命令キャッシュ、L1データキャッシュ、またはL2キャッシュのいずれかにのみ存在できます。ただし、データキャッシュ内の行に、TLBの1つにもあるPTEが含まれる可能性があります。オペレーティングシステムは、メモリ内のページテーブルが更新されたときに、TLBの一部をフラッシュすることにより、TLBの一貫性を維持します。

K8は、メモリに保存されない情報、つまり予測情報もキャッシュします。これらのキャッシュは上の図には示されていません。このクラスのCPUで通常行われているように、K8にはかなり複雑な 分岐予測があり、分岐が行われるかどうかを予測するのに役立つテーブルと、分岐とジャンプのターゲットを予測する他のテーブルがあります。この情報の一部は、レベル1命令キャッシュと統合セカンダリキャッシュの両方の命令に関連付けられています。

K8は興味深いトリックを使用して、予測情報と命令をセカンダリキャッシュに保存します。セカンダリキャッシュ内のラインは、それらのラインがデータまたは命令のプライマリキャッシュから削除されたかどうかに応じて、ECCまたはパリティのいずれかによって偶発的なデータ破損(アルファ粒子ストライクなど)から保護されます。パリティコードはECCコードよりもビット数が少ないため、命令キャッシュの行には予備のビットがいくつかあります。これらのビットは、これらの命令に関連付けられた分岐予測情報をキャッシュするために使用されます。最終的な結果として、分岐予測子の有効履歴テーブルが大きくなるため、精度が向上します。

その他の階層

他のプロセッサには他の種類の予測子があり(たとえば、DEC Alpha 21264のストアからロードへのバイパス予測子)、さまざまな特殊な予測子が将来のプロセッサで繁栄する可能性があります。

これらの予測子は、計算にコストがかかる情報を格納するという点でキャッシュです。予測子について説明するときに使用される用語の一部は、キャッシュの用語と同じです(分岐予測子のヒットについて説明します)が、予測子は通常、キャッシュ階層の一部とは見なされません。

K8は、命令とデータキャッシュをハードウェアで一貫性のある状態に保ちます。つまり、ストア命令のすぐ後に続く命令へのストアは、その後続の命令を変更します。AlphaやMIPSファミリのような他のプロセッサは、命令キャッシュの一貫性を維持するためにソフトウェアに依存しています。プログラムが一貫性を確保するためにオペレーティングシステム機能を呼び出すまで、ストアが命令ストリームに表示されることは保証されません。

タグRAM

コンピュータエンジニアリングでは、タグRAMを使用して、可能なメモリ位置のどれが現在CPUキャッシュに格納されているかを指定します。[48] [49] シンプルなダイレクトマップ設計では、高速SRAMを使用できます。より高い連想キャッシュは通常、連想メモリを使用します。

実装

キャッシュ読み取りは、1サイクル以上かかる最も一般的なCPU操作です。プログラムの実行時間は、レベル1のデータキャッシュヒットの遅延に非常に敏感になる傾向があります。多大な設計努力が必要であり、多くの場合、電力とシリコン領域が消費され、キャッシュが可能な限り高速になります。

最も単純なキャッシュは、仮想的にインデックス付けされた直接マップされたキャッシュです。仮想アドレスは加算器を使用して計算されます。加算器は、アドレスの関連部分が抽出され、ロードされたデータを返すSRAMのインデックス作成に使用されます。データはバイトシフターでバイトアラインされ、そこから次の操作にバイパスされます。内部ループでタグをチェックする必要はありません。実際、タグを読み取る必要すらありません。パイプラインの後半で、ロード命令がリタイアされる前に、ロードされたデータのタグを読み取り、仮想アドレスと照合してキャッシュヒットがあったことを確認する必要があります。ミスすると、要求されたキャッシュラインでキャッシュが更新され、パイプラインが再開されます。

連想キャッシュはより複雑です。これは、キャッシュのどのエントリを選択するかを決定するために、何らかの形式のタグを読み取る必要があるためです。Nウェイセットアソシアティブレベル1キャッシュは通常、N個の可能なタグすべてとN個のデータを並行して読み取り、一致するタグに関連付けられたデータを選択します。レベル2キャッシュは、最初にタグを読み取ることで電力を節約することがあるため、データSRAMから1つのデータ要素のみが読み取られます。

双方向連想キャッシュの読み取りパス

隣接する図は、アドレスのさまざまなフィールドが使用される方法を明確にすることを目的としています。アドレスビット31が最上位、ビット0が最下位です。この図は、64バイト(B)ライン、32ビット読み取り幅、32ビット仮想アドレスを備えた4 KB、双方向セットアソシアティブ、仮想インデックス、仮想タグ付きキャッシュ のSRAM、インデックス作成、および多重化を示しています。

キャッシュは4KBで64Bラインがあるため、キャッシュには64ラインしかなく、それぞれ21ビットタグのペアを持つ32行のタグSRAMから一度に2行を読み取ります。仮想アドレスビット31〜6の任意の機能を使用して、タグおよびデータSRAMにインデックスを付けることができますが、最下位ビットを使用するのが最も簡単です。

同様に、キャッシュは4 KBで、4 Bの読み取りパスがあり、アクセスごとに2つの方法で読み取るため、データSRAMは512行×8バイト幅です。

より新しいキャッシュは、16 KB、4ウェイセットアソシアティブ、仮想インデックス、仮想ヒント、および物理タグ付きで、32 Bライン、32ビット読み取り幅、36ビット物理アドレスである可能性があります。このようなキャッシュの読み取りパスの繰り返しは、上記のパスと非常によく似ています。タグの代わりに、vhintが読み取られ、仮想アドレスのサブセットと照合されます。パイプラインの後半で、仮想アドレスはTLBによって物理アドレスに変換され、物理タグが読み取られます(vhintがキャッシュの読み取り方法を提供するため、1つだけ)。最後に、物理アドレスが物理タグと比較され、ヒットが発生したかどうかが判断されます。

一部のSPARC設計では、仮想アドレス加算器をSRAMデコーダーに折りたたむことにより、L1キャッシュの速度を数ゲート遅延で改善しています。Sumアドレス指定デコーダーを参照してください

歴史

キャッシュテクノロジーの初期の歴史は、仮想メモリの発明と使用に密接に関係しています。[要出典] 半導体メモリの不足とコストのため、1960年代の初期のメインフレームコンピュータは、プログラムが使用するフラットな仮想メモリ空​​間にマッピングされた、物理メモリの複雑な階層を使用していました。メモリ技術は、半導体、磁気コア、ドラム、ディスクにまたがっています。プログラムによって表示および使用される仮想メモリはフラットであり、キャッシュを使用して、プロセッサアクセスの前にデータと命令を最速のメモリにフェッチします。キャッシュサイズを最適化するために、広範な調査が行われました。最適な値は、最小のキャッシュサイズを必要とするAlgolと最大のキャッシュサイズを必要とするFortranおよびCobolで使用されるプログラミング言語に大きく依存することがわかりました。[[論争 ]

マイクロコンピュータ技術の初期には、メモリアクセスはレジスタアクセスよりわずかに遅いだけでした。しかし、1980年代以降[50]、プロセッサとメモリ間のパフォーマンスのギャップは拡大しています。マイクロプロセッサは、特に動作周波数の点でメモリよりもはるかに速く進歩したため、メモリはパフォーマンスのボトルネックになりました。すべてのメインメモリをCPUと同じ速度にすることは技術的には可能でしたが、より経済的に実行可能な方法が採用されました。低速メモリを十分に使用するだけでなく、パフォーマンスのギャップを緩和するために小さな高速キャッシュメモリを導入します。これにより、同じ価格で桁違いに容量が増え、合計パフォーマンスがわずかに低下しました。

最初のTLB実装

TLBの最初の文書化された使用法は、GE 645 [51]IBM360 / 67 [52]であり、どちらもTLBとして連想メモリを使用していました。

最初の命令キャッシュ

命令キャッシュの最初の文書化された使用法は、CDC6600でした。[53]

最初のデータキャッシュ

データキャッシュの最初の文書化された使用法は、IBM System / 360モデル85でした。 [54]

68kマイクロプロセッサの場合

1982年にリリースされた68010には、2つの命令のみで構成されるループを高速化する小さな特殊なケースの命令キャッシュと見なすことができる「ループモード」があります。1984年にリリースされた68020は、これを256バイトの一般的な命令キャッシュに置き換えました。これは、真のオンチップキャッシュメモリを備えた最初の68kシリーズプロセッサです。

1987年にリリースされた68030は、基本的に68020コアであり、追加の256バイトのデータキャッシュ、オンチップメモリ​​管理ユニット(MMU)、プロセスの縮小、およびキャッシュのバーストモードが追加されています。1990年にリリースされた68040には、それぞれ4キロバイトの分割命令キャッシュとデータキャッシュがあります1994年にリリースされた68060には、次のものがあります。8KBデータキャッシュ(4方向アソシアティブ)、8 KB命令キャッシュ(4方向アソシアティブ)、96バイトFIFO命令バッファー、256エントリブランチキャッシュ、および64エントリアドレス変換キャッシュMMUバッファ(4方向連想)。

x86マイクロプロセッサの場合

x86マイクロプロセッサが386で20MHz以上のクロックレートに達すると、パフォーマンスを向上させるために、システムに少量の高速キャッシュメモリが搭載されるようになりました。これは、メインメモリに使用されるDRAMに、最大120 nsのかなりの遅延と、リフレッシュサイクルがあったためです。キャッシュは、より高価ですが、非常に高速なSRAM メモリセルから構築されていました。SRAMメモリセルのレイテンシは、当時10〜25nsでした。初期のキャッシュはプロセッサの外部にあり、通常、オプションの追加機能またはアップグレード機能としてキャッシュを有効にするために、ソケットに配置された 8つまたは9つのDIPデバイスの形でマザーボード上に配置されていました。

Intel 386プロセッサの一部のバージョンは、16〜256KBの外部キャッシュをサポートできます。

486プロセッサでは、8KBのキャッシュがCPUダイに直接統合されていました。このキャッシュは、低速のマザーボード上のキャッシュまたはレベル2(L2)キャッシュと区別するために、レベル1またはL1キャッシュと呼ばれていました。これらのマザーボード上のキャッシュははるかに大きく、最も一般的なサイズは256KBです。マザーボード上のキャッシュの人気はPentiumMMXの時代まで続きましたが、 SDRAMの導入と、バスクロックレートとCPUクロックレートの不一致の拡大により、マザーボード上のキャッシュはメインメモリよりわずかに高速になりました。

x86マイクロプロセッサでのキャッシュ実装の次の開発は、 Pentium Proから始まりました。これは、マイクロプロセッサと同じ周波数でクロックされる、マイクロプロセッサと同じパッケージにセカンダリキャッシュをもたらしました。

マザーボード上のキャッシュは、 AMDK6-2およびAMDK6-IIIプロセッサのおかげで、長い間人気を博しました。これは、以前はマザーボード上のキャッシュでIntelによって使用されていたSocket7を引き続き使用していました。K6-IIIには256KBのオンダイL2キャッシュが含まれ、オンボードキャッシュをL3という名前の第3レベルのキャッシュとして利用しました(最大2 MBのオンボードキャッシュを備えたマザーボードが製造されました)。Socket 7が廃止された後、マザーボード上のキャッシュはx86システムから消えました。

3レベルのキャッシュは、L3キャッシュがCPUダイに追加された複数のプロセッサコアの導入により、最初に再び使用されました。新しいプロセッサ世代では、合計キャッシュサイズがますます大きくなることが一般的になり、最近(2011年現在)、数十メガバイトのレベル3キャッシュサイズが見つかることも珍しくありません。[55]

Intelは、 Haswell マイクロアーキテクチャを備えたレベル4のオンパッケージキャッシュを導入しましたCrystalwell [26] Intelの統合IrisProグラフィックスのGT3eバリアントを搭載したHaswellCPUは、同じパッケージに128 MBの組み込みDRAM(eDRAM )を効果的に搭載しています。このL4キャッシュは、オンダイGPUとCPUの間で動的に共有され、CPUのL3キャッシュの犠牲キャッシュとして機能します。[27]

ARMマイクロプロセッサの場合

Apple M1 CPUには、コアの種類に応じて、コアごとに128または192 KBの命令L1キャッシュがあります(レイテンシ/シングルスレッドのパフォーマンスにとって重要)。ラップトップだけでなく、あらゆるCPUタイプのL1キャッシュでは異常に大きくなりますが、合計キャッシュはラップトップの場合、メモリサイズは異常に大きくはなく(合計はスループットにとってより重要です)、IBMのメインフレームでははるかに大きい合計(L3やL4など)のサイズを利用できます。

現在の研究

初期のキャッシュ設計は、キャッシュとRAMの直接コストと平均実行速度に完全に焦点を合わせていました。最近のキャッシュ設計では、エネルギー効率、フォールトトレランス、およびその他の目標も考慮されています。[56] [57]

キャッシュサイクル時間、エネルギー、および領域の間のトレードオフを調査するのに役立つ、コンピューターアーキテクトが利用できるツールがいくつかあります。CACTIキャッシュシミュレーター[58]とSimpleScalar命令セットシミュレーターは2つのオープンソースオプションです。

マルチポートキャッシュ

マルチポートキャッシュは、一度に複数のリクエストを処理できるキャッシュです。従来のキャッシュにアクセスする場合、通常は単一のメモリアドレスを使用しますが、マルチポートキャッシュでは、一度にN個のアドレスを要求する場合があります。ここでNは、プロセッサとキャッシュを介して接続されたポートの数です。これの利点は、パイプライン化されたプロセッサがパイプラインのさまざまなフェーズからメモリにアクセスできることです。もう1つの利点は、さまざまなキャッシュレベルでスーパースカラープロセッサの概念を使用できることです。

も参照してください

メモ

  1. ^ 最初のページングマシンであるFerrantiAtlas [ 19] [20]には、メインメモリにページテーブルがありませんでした。コアの512ワードページフレームごとに1つのエントリを持つ連想メモリがありました。

参考文献

  1. ^ ガブリエルトーレス(2007年9月12日)。「キャッシュメモリのしくみ」
  2. ^ スミス、アランジェイ(1982年9月)。「キャッシュメモリー」(PDF)コンピューティング調査14(3):473–530。土井10.1145 /356887.356892S2CID6023466_  
  3. ^ 「コンピュータアーキテクチャを変更することはスループットを上げる方法であり、IBMの研究者を示唆している」。エレクトロニクス49(25):30–31。1976年12月23日。
  4. ^ 「IBMz13およびIBMz13sの技術紹介」(PDF)IBM2016年3月。p。20。
  5. ^ 「製品ファクトシート:コアからエッジまでの5Gネットワ​​ークインフラストラクチャの高速化」インテルニュースルーム(プレスリリース)2020年4月12日取得32KB /コアのL1キャッシュ、4コアクラスターあたり4.5MBのL2キャッシュ、および最大15MBの共有LLCキャッ​​シュ。
  6. ^ スミス、ライアン。「IntelがAtomP5900を発表:無線アクセスネットワーク用の10nmAtom」www.anandtech.com 2020年4月12日取得
  7. ^ 「キャッシュデザイン」(PDF)ucsd.edu2010-12-02。p。10〜15 2014年2月24日取得
  8. ^ IEEEXplore-消費電力を削減するための段階的なセットアソシアティブキャッシュ設計Ieeexplore.ieee.org(2009-08-11)。2013年7月30日に取得。
  9. ^ Sanjeev Jahagirdar; バルゲーゼジョージ; インダーソディ; ライアンウェルズ(2012)。「第3世代IntelCoreマイクロアーキテクチャの電源管理(以前はコードネームIvy Bridge)」(PDF)hotchips.orgp。18. 2020-07-29のオリジナル(PDF)からアーカイブ2015年12月16日取得
  10. ^ a b アンドレ・セズネック(1993)。「双方向スキューアソシエイティブキャッシュのケース」。ACMSIGARCHコンピュータアーキテクチャニュース21(2):169–178。土井10.1145 /173682.165152
  11. ^ a bC 。コジラキス。「講義3:高度なキャッシング技術」(PDF)2012年9月7日にオリジナル(PDF)からアーカイブされました。
  12. ^ マイクロアーキテクチャ「スキューされたアソシアティブキャッシュには、従来のセットアソシアティブキャッシュに比べて大きな利点があります。」
  13. ^ ネイサンN.サドラー; ダニエル・J・ソリン(2006)。「マイクロプロセッサのL1データキャッシュのエラー保護スキームの選択」(PDF)p。4.4。
  14. ^ ジョン・L・ヘネシー; デビッドA.パターソン(2011)。コンピュータアーキテクチャ:定量的アプローチp。B-9。ISBN 978-0-12-383872-8
  15. ^ デイビッド・A・パターソン; ジョンL.ヘネシー(2009)。コンピュータの構成と設計:ハードウェア/ソフトウェアインターフェイスp。484. ISBN 978-0-12-374493-7
  16. ^ a b c Gene Cooperman(2003)。「キャッシュの基本」
  17. ^ ベンデュガン(2002)。「キャッシュについて」
  18. ^ ハーベイG.クラゴン。「メモリシステムとパイプラインプロセッサ」。1996。ISBN0-86720-474-5 ISBN978-0-86720-474-2 _ _ _ 「第4.1章:キャッシュアドレス指定、仮想または実」p。209 [1]  
  19. ^ サムナー、FH; ヘイリー、G。; Chenh、ECY(1962)「「アトラス」コンピュータの中央制御装置」。情報処理1962IFIP会議議事録。IFIP会議の議事録62.スパルタン。
  20. ^ a b Kilburn、T。; ペイン、RB; ハワース、DJ(1961年12月)。「アトラススーパーバイザー」コンピュータ-トータルシステムコントロールの鍵会議議事録。ワシントンDCマクミランの東部合同コンピュータ会議の20議事録。pp。279–294。
  21. ^ Kaxiras、Stefanos; Ros、Alberto(2013)。効率的な仮想キャッシュコヒーレンスの新しい視点コンピュータアーキテクチャに関する第40回国際シンポジウム(ISCA)pp。535–547。CiteSeerX10.1.1.307.9125_ 土井10.1145 /2485922.2485968ISBN  9781450320795S2CID15434231 _
  22. ^ 「キャッシングを理解する」LinuxJournal 2010年5月2日取得
  23. ^ テイラー、ジョージ; デイビス、ピーター; Farmwald、Michael(1990)。「TLBスライス-低コストの高速アドレス変換メカニズム」。CH2887-8 / 90/0000/0355 $ 01.OO。 {{cite journal}}引用ジャーナルには|journal=ヘルプ)が必要です
  24. ^ ティモシーロスコー; アンドリューバウマン(2009-03-03)。「高度なオペレーティングシステムのキャッシュとTLB(263-3800-00L)」(PDF)systems.ethz.ch2011-10-07にオリジナル(PDF)からアーカイブされました2016年2月14日取得
  25. ^ NPJouppi。「小さな完全に関連付けられたキャッシュとプリフェッチバッファを追加することにより、直接マップされたキャッシュのパフォーマンスを向上させます。」-コンピュータアーキテクチャに関する第17回国際シンポジウム、1990年。議事録、 doi 10.1109 / ISCA.1990.134547
  26. ^ a b "製品(以前のCrystal Well)"インテル2013年9月15日取得
  27. ^ a b "Intel Iris Pro 5200グラフィックスレビュー:Corei7-4950HQテスト済み"AnandTech 2013年9月16日取得
  28. ^ イアンカトレス(2015年9月2日)。「IntelSkylakeMobile and Desktop Launch、withArchitectureAnalysis」AnandTech。
  29. ^ Anand Lal Shimpi(2000-11-20)。「Pentium4のキャッシュ– Intel Pentium 4 1.4 GHz&1.5GHz」AnandTech 2015年11月30日取得
  30. ^ a b アグナーフォグ(2014-02-19)。「Intel、AMD、VIA CPUのマイクロアーキテクチャ:アセンブリプログラマーとコンパイラーメーカー向けの最適化ガイド」(PDF)agner.org 2014年3月21日取得
  31. ^ David Kanter(2010年8月26日)。「AMDのブルドーザーマイクロアーキテクチャ-メモリサブシステムの続き」リアルワールドテクノロジーズ
  32. ^ David Kanter(2010年9月25日)。「IntelのSandyBridgeマイクロアーキテクチャ-命令デコードとuopキャッシュ」リアルワールドテクノロジーズ
  33. ^ a b Baruch Solomon; Avi Mendelson; ドロン・オレンスタイン; Yoav Almog; ロニーロネン(2001年8月)。「マイクロオペレーションキャッシュ:可変命令長ISA用のパワーアウェアフロントエンド」(PDF)ISLPED'01:低電力エレクトロニクスと設計に関する2001年国際シンポジウムの議事録(IEEEカタログ番号01TH8581)インテルpp。4–9。土井10.1109 /LPE.2001.945363ISBN  978-1-58113-371-4S2CID195859085  _ 2013年10月6日取得
  34. ^ a b Anand Lal Shimpi(2012-10-05)。「IntelのHaswellアーキテクチャの分析」AnandTech 2013年10月20日取得
  35. ^ イアンカトレス(2016-08-18)。「AMDZenマイクロアーキテクチャ:デュアルスケジューラ、Micro-Opキャッシュ、およびメモリ階層が明らかになりました」AnandTech 2017年4月3日取得
  36. ^ レオング; Dipti Motiani(2003年10月)。「トレースキャッシュ」(PDF)2013年10月6日取得
  37. ^ Kun Niu(2015年5月28日)。「BTIC(分岐ターゲット命令キャッシュ)はどのように機能しますか?」2018年4月7日取得
  38. ^ 「IntelSmartCache:デモ」インテル2012年1月26日取得
  39. ^ 「IntelCoreマイクロアーキテクチャとスマートメモリアクセスの内部」インテル2006.p。5. 2011年12月29日のオリジナル(PDF)からアーカイブ2012年1月26日取得
  40. ^ 「IntelIrisPro 5200グラフィックスレビュー:Corei7-4950HQテスト済み」AnandTech 2014年2月25日取得
  41. ^ Tian Tian; Chiu-Pi Shih(2012-03-08)。「共有キャッシュマルチコアシステムのためのソフトウェア技術」インテル2015年11月24日取得
  42. ^ Oded Lempel(2013-07-28)。「第2世代IntelCoreプロセッサーファミリー:Intel Core i7、i5、およびi3」(PDF)hotchips.orgp。7–10,31–45。2020-07-29にオリジナル(PDF)からアーカイブされました2014年1月21日取得
  43. ^ チェン、J。ブラッドリー; ボーグ、アニタ; Jouppi、Norman P.(1992)。「TLBパフォーマンスのシミュレーションベースの研究」。SIGARCHコンピュータアーキテクチャニュース20(2):114–123。土井10.1145 /146628.139708
  44. ^ 「L1およびL2キャッシュの説明」amecomputers.com2014-07-14にオリジナルからアーカイブされました2014年6月9日取得
  45. ^ a b c Ying Zheng; ブライアンT.デイビス; マシュージョーダン(2004-06-25)。「排他的キャッシュ階層のパフォーマンス評価」(PDF)ミシガン工科大学2014年6月9日取得
  46. ^ Aamer Jaleel; エリック・ボーチ; マリニバンダル; サイモンC.スティーリージュニア; ジョエルエマー(2010-09-27)。「インクルーシブキャッシュを使用した非インクルーシブキャッシュパフォーマンスの実現」(PDF)jaleels.org 2014年6月9日取得
  47. ^ 「AMDK8」Sandpile.org2007年5月15日にオリジナルからアーカイブされました2007年6月2日取得
  48. ^ 「Cortex-R4およびCortex-R4Fテクニカルリファレンスマニュアル」arm.com 2013年9月28日取得
  49. ^ 「L210キャッシュコントローラテクニカルリファレンスマニュアル」arm.com 2013年9月28日取得
  50. ^ Mahapatra、Nihar R。; ベンカトラオ、バラクリシュナ(1999)。「プロセッサメモリのボトルネック:問題と解決策」(PDF)交差点5(3es):2–es。土井10.1145 /357783.331677S2CID11557476 _ 2013年3月5日取得  
  51. ^ GE-645システムマニュアル(PDF)ゼネラルエレクトリック1968年1月2020年7月10日取得
  52. ^ IBM System / 360モデル67の機能特性(PDF)第3版。IBM1972年2月。GA27-2719-2。
  53. ^ James E. Thornton(1964年10月)、「制御データ6600での並列操作」(PDF)Proc。1964年10月27日から29日までの秋の合同コンピュータ会議、パートII:超高速コンピュータシステム
  54. ^ IBM(1968年6月)。IBM System / 360モデル85の機能特性(PDF)第2版​​。A22-6916-1。
  55. ^ 「Intel®Xeon®プロセッサE7ファミリ」インテル2013年10月10日取得
  56. ^ サリーアディー(2009)。「チップ設計はデータへのスニークアタックを阻止します」 {{cite journal}}引用ジャーナルには|journal=ヘルプ)が必要です
  57. ^ Zhenghong Wang; Ruby B. Lee(2008年11月8〜12日)。パフォーマンスとセキュリティが強化された新しいキャッシュアーキテクチャ(PDF)マイクロアーキテクチャに関する第41回IEEE / ACM国際シンポジウム。pp。83–93。2012年3月6日にオリジナル(PDF)からアーカイブされました。
  58. ^ 「CACTI」Hpl.hp.com 2010年5月2日取得

外部リンク