CPUキャッシュとは、メインメモリ内の頻繁に使用されるデータの一部を、より小さく高速なメモリの「キャッシュ」に保持することで、メモリ内のデータへのアクセス時間を短縮するハードウェアのことです。
コンピュータ システムのパフォーマンスは、整数演算、分岐演算、浮動小数点演算などの実行ユニット、I/O ユニット、バス、キャッシュ、メモリ システムなど、すべての個々のユニットのパフォーマンスに依存します。プロセッサの速度とメイン メモリの速度の差は指数関数的に拡大しています。2001~2005 年までは、クロック周波数で測定される CPU 速度は年間 55% 増加しましたが、メモリ速度は 7% しか増加しませんでした。[ 1 ]この問題はメモリ ウォールとして知られています。キャッシュとその階層の動機は、この速度の差を埋め、メモリ ウォールを克服することです。
高性能コンピュータのほとんどにおいて、最も重要な構成要素はキャッシュです。キャッシュは速度ギャップを埋めるために存在するため、キャッシュサイズ、アソシアティビティ、置換ポリシーなどのさまざまなパラメータを設計および選択する際には、その性能測定と指標が重要になります。キャッシュ性能は、システム性能に制約を与える要因であるキャッシュヒットとキャッシュミスに依存します。キャッシュヒットとは、キャッシュ内で実際にデータを見つけたキャッシュへのアクセス回数であり、キャッシュミスとは、キャッシュ内でブロックを見つけられなかったアクセス回数です。これらのキャッシュヒットとミスは、平均アクセス時間(AAT)、別名AMAT(平均メモリアクセス時間)という用語に影響を与えます。AMATは、その名の通り、メモリにアクセスするのにかかる平均時間です。プロセッサ速度が上がるにつれてこの数値が非常に重要になるため、これはキャッシュ性能測定における主要な指標の1つです。
パフォーマンスをテストする上で役立つもう一つの指標は、キャッシュミスのべき乗則です。これは、いずれかのキャッシュサイズにおけるミス数が既知である場合に、キャッシュサイズを変更したときのミス数を示します。同様に、異なるアソシアティビティにおけるミス数の観点からキャッシュのパフォーマンスをテストしたい場合は、スタック距離プロファイリングが使用されます。
キャッシュ階層によるプロセッサのパフォーマンス向上は、キャッシュからのブロック要求を満たすキャッシュへのアクセス数(キャッシュヒット)と満たさないアクセス数に依存します。キャッシュからのデータ読み書きの試行が失敗すると(キャッシュミス)、下位レベルまたはメインメモリへのアクセスが発生し、レイテンシが増加します。キャッシュミスには、3Cs [ 2 ]と呼ばれる 3 つの基本的なタイプと、あまり一般的ではないその他のキャッシュミスがあります。
メモリブロックは、最初に参照される際に必ずミスが発生します。これは、強制ミスの回数が、これまで参照された異なるメモリブロックの数に等しいことを意味します。強制ミスはコールドミスとも呼ばれます。ブロックをプリフェッチしない限り、コールドミスは回避できません。
空間的局所性を活用するためにブロックサイズをある程度大きくすると、コールドミスが減少することが観察されている。ブロックサイズを大きくすると、ブロック内の近傍のワードがプリフェッチされ、将来のコールドミスを防ぐことができる。ただし、ブロックサイズを大きくしすぎると、不要なデータがプリフェッチされてしまい、コールドミスが増加する可能性がある。
コンフリクトミスは、必要なデータが以前キャッシュに存在していたにもかかわらず、キャッシュから追い出された場合に発生します。このような追い出しは、別のリクエストが同じキャッシュラインにマッピングされたために起こります。一般的に、コンフリクトミスは、制限付きアソシアティブキャッシュのミス数から、同じサイズとキャッシュブロックサイズの完全アソシアティブキャッシュのミス数を差し引くことで測定されます。
コンフリクトミスは十分なアソシアティビティの欠如に起因するため、アソシアティビティをある程度高める(8ウェイアソシアティビティはフルアソシアティブとほぼ同等の効果を発揮する)ことでコンフリクトミスの量は減少するが、このようなアプローチではキャッシュアクセス時間が増加し、セットアソシアティブキャッシュよりもはるかに多くの電力を消費する。
容量ミスは、キャッシュのマッピング機能ではなく、キャッシュのサイズが限られているために発生します。ワーキングセット、つまりプログラムにとって現在重要なデータがキャッシュよりも大きい場合、容量ミスが頻繁に発生します。3C (キャッシュ、キャッシュ、キャッシュ)の中で、容量ミスは最も識別が難しく、完全連想キャッシュにおける非強制ミスと考えることができます。シングルプロセッサシステムでは、強制ミスと競合ミスの数を差し引いた後のミスを容量ミスとして分類できます。
キャパシティミスはキャッシュサイズの制限に起因するため、このようなミスを減らす簡単な方法はキャッシュサイズを増やすことです。この方法は非常に直感的ですが、アクセス時間の増加、キャッシュ面積の増加、および消費電力の増加につながります。また、一定のキャッシュサイズを超えると、ミスの数は飽和状態になり、キャッシュサイズを増やしても減少しなくなります。
上記の3種類のミスは、単一プロセッサのミスのみを対象としています。
キャッシュミスの3Csグループは、キャッシュを備えたマルチプロセッサシステムが関与する場合、4Csに拡張できます。4 番目の C はコヒーレンスミスです。コヒーレンスミスカウントは、スレッドのキャッシュに存在するはずのキャッシュラインが別のスレッドからの書き込みによって無効化されたためにミスしたメモリアクセスの数です。 [ 3 ]マルチプロセッサシステムでは、メモリブロックのコピーが 1 つだけ存在するか、すべてのコピーが同じ値を持つ場合にコヒーレンスが維持されます。メモリブロックのすべてのコピーが同じ値を持たない場合でも、必ずしもコヒーレンスミスにつながるわけではありません。コヒーレンスミスは、スレッドがメモリブロックの異なる値を観測するようなロードを実行するときに発生します。[ 4 ]
一貫性の問題は複雑であり、並列プログラムのスケーラビリティに影響を与える。この問題を解決するには、システム全体で同じメモリ位置へのすべてのアクセスにグローバルな順序が存在する必要がある。
4Cs のキャッシュ ミスのグループは、マルチ プロセッサ システムに、エントリを置き換えることができるキャッシュとして構成されたコヒーレンス ディレクトリが含まれている場合、さらに5Csに拡張できます。この 5 番目の C はカバレッジを表します。 [ 5 ]カバレッジ ミス カウントは、ディレクトリの削除の結果としてプロセッサのキャッシュに存在するはずのキャッシュ ラインが無効になったためにミスしたメモリ アクセスの数です。ディレクトリが容量の制限によりキャッシュ ラインを追跡できない場合、コヒーレンスを維持するために、そのラインはプロセッサのキャッシュから無効にする必要があります。
割り込み、コンテキストスイッチ、システムコールなどのシステムアクティビティにより、プロセスが中断され、キャッシュの状態が変更されます。プロセスの実行が再開されると、変更されたキャッシュの状態を復元するためにキャッシュミスが発生します。これらのミスはシステム関連のミスと呼ばれます。[ 2 ]
さらに、コンテキスト切り替えによるキャッシュミスは、以下に説明する2つのカテゴリに分類できます。
コンテキストスイッチが発生すると、キャッシュの状態が変更され、一部のブロックが置き換えられます。これらのブロックへのアクセスミスは、置換ミスと呼ばれます。
コンテキストスイッチによってキャッシュ内のブロックが置き換えられない場合でも、そのブロックの最新性は変化することがあります。ミスがブロックの置き換えではなく、最新性の変化によって発生する場合、それは再順序ミスと呼ばれます。ただし、中断されたプロセスが実行を再開する際、他のミスによってこれらの再順序ブロックが追い出されない限り、再順序ブロックはコンテキストスイッチミスにはつながりません。
コンテキストスイッチングが頻繁に発生すると、システム関連のミスが顕著になります。キャッシュサイズを大きくすると、容量ミスと競合ミスは減少しますが、キャッシュを共有するプロセスのワーキングセットよりもキャッシュサイズが小さい場合、システム関連のミスが増加することが観察されています。したがって、システム関連のミスを減らすことは課題となります。
これらのキャッシュミスは、命令あたりのサイクル数(CPI)の増加に直接相関します。ただし、キャッシュミスがCPIに与える影響の度合いは、命令レベル並列性(ILP)によってキャッシュミスのどれだけが計算とオーバーラップできるか、またメモリレベル並列性によって他のキャッシュミスのどれだけがオーバーラップできるかにも依存します。[ 2 ]これらの影響を両方とも無視すると、平均メモリアクセス時間が重要な指標となります。これは、メモリシステムと階層のパフォーマンスの尺度を提供します。これは、メモリアクセスを実行するのにかかる平均時間を指します。これは、メモリ命令の実行時間とメモリストールサイクルの合計です。実行時間はキャッシュアクセスにかかる時間であり、メモリストールサイクルには、キャッシュミスを処理してメモリの下位レベルにアクセスする時間が含まれます。アクセスレイテンシ、ミス率、およびミス ペナルティがわかっている場合、平均メモリアクセス時間は次のように計算できます。
どこレベル1キャッシュのアクセスレイテンシは、レベル 1 キャッシュのミス率とこれは、上位レベルでのミスが上位レベルでのヒットと比較して処理されるまでに要する追加サイクルであり、以下の式で計算されます。
この式はさらに拡張して、メモリ階層のすべての後続レベルに対して再帰的に使用してAMAT を取得できます。 [ 6 ]
キャッシュミスのべき乗法則は、 キャッシュサイズによって影響を受けるプログラムの特定のアプリケーションにおける容量ミスの傾向を示します。この経験的観察から、ミス率とキャッシュサイズの関係を示すべき乗法則の数学的形式が導き出されました。それは次のように表すことができます。
ここで、MはサイズCのキャッシュのミス率、M 0はベースライン キャッシュのミス率です。指数αはワークロードに固有のもので、通常は 0.3 ~ 0.7 の範囲で、平均は 0.5 です。べき乗則は、多くの実世界のベンチマークで検証されています。[ 7 ]
この関係は、キャッシュサイズを一定量増やしても、キャッシュミスのごく一部しか解消できないことを示しています。この法則は、キャッシュサイズが一定の有限範囲内にある場合にのみ成り立ち、その範囲内ではミス率は横ばいになりません。ミス率は、ある一定の十分な大きさのキャッシュサイズで最終的に横ばいになり、それ以降はこの関係は正確な推定値を与えません。
スタック距離プロファイルは、キャッシュミスがキャッシュサイズによってどのように影響を受けるかをより適切に表現します。キャッシュミスのべき乗則は、同じことを大まかに近似したにすぎません。スタック距離プロファイルは、完全連想キャッシュまたはセット連想キャッシュにおけるアプリケーションの一時的な再利用動作を捉えます。[ 8 ]
より時間的な再利用動作を示すアプリケーションは、一般的に最近使用されたデータにアクセスします。キャッシュの連想性を次のように仮定しましょう。このキャッシュのスタック距離プロファイル情報を収集するには、LRU置換ポリシーを採用していると仮定します。カウンターは以下から使用されますにカウンターが1つ追加されますミスをカウントするカウンター。ヒットがあったときに増加します方法とカウンターは、ミスが発生するたびに増加します。スタック距離プロファイルは、ヒットの傾向を示し、最も最近使用されたデータから最も最近使用されていないデータへと減少します。このスタック距離プロファイル情報を使用して、アソシアティビティを持つキャッシュのキャッシュミスを測定できます。また、LRU交換ポリシーでは、計算すると次のようになります。
このプロファイリング情報には、異なる連想関係における時間的再利用しか捉えられないという限界がある。その他の目的においては、時間的再利用をより詳細に調査する必要がある。
{{cite book}}: CS1 maint: 複数の名前: 著者リスト (リンク){{cite book}}: CS1 maint: 複数の名前: 著者リスト (リンク){{cite book}}: CS1 maint: 複数の名前: 著者リスト (リンク)