CPUキャッシュとは何ですか?

最新のCPUは信じられないほど高速に動作します。 それらはシステムRAMを大幅に上回る可能性があります。 CPUとメモリ間のこの速度の不均衡により、プロセッサはアイドル状態になり、データが送信されるのを待って、プロセスの実行を継続できるようになります。 これを防ぎ、CPUをどんどん高速に実行できるようにするために、CPUキャッシュが使用されます。

CPUキャッシュはどのようにCPUを高速化しますか?

CPUキャッシュは、可能な限り高速になり、CPUが要求するデータをキャッシュするように設計されています。 CPUキャッシュの速度は、遅延、帯域幅、近接性の3つの方法で最適化されています。 CPUキャッシュは非常に低いレイテンシで動作し、結果が返されるまでにかかる時間を最小限に抑えます。 たとえば、Intel i9-9900kのキャッシュ遅延は、L1、L2、およびL3キャッシュに対してそれぞれ0.8、2.4、および11.1ナノ秒です。 比較すると、最新の高速RAMの遅延は14ナノ秒のオーダーです。

ヒント:キャッシュレベルについては後で詳しく説明しますが、キャッシュの下位層を配置する方が高速ですが、コストが高くなるため、容量が少なくなります。 ナノ秒は10億分の1秒であるため、0.8秒の遅延は、結果を返すのに10億分の1秒未満かかることを意味します。

帯域幅に関しては、CPUキャッシュにより、従来のストレージやRAMよりもパフォーマンスが大幅に向上します。 L1およびL3キャッシュの読み取り速度は、それぞれ2.3 TB / sおよび370GB / sでピークに達する可能性がありますが、RAMの帯域幅は通常約40 GB / sです。 この帯域幅の増加は、CPUキャッシュがRAMよりもはるかに高速にデータをCPUに転送できることを意味します。

可能な最大速度を達成するために、CPUキャッシュは実際にはCPUダイ自体のシリコンに組み込まれています。 これにより、電気信号が移動する必要のある距離が最小限に抑えられるため、遅延が可能な限り低く抑えられます。 たとえば、L3キャッシュが最初にマザーボードからCPUダイに移動されたとき、当時のプロセッサ(Pentium 4 EE)は10〜20%のパフォーマンス向上を得ることができました。

CPUキャッシュアーキテクチャ

最近のCPUは通常、L1-3というラベルの付いた3層のCPUキャッシュを使用します。番号の小さいキャッシュは、CPUコアに近く、高速で、高価です。 マルチコアCPUの個々のCPUコアには、独自のL1キャッシュがあります。 通常、L1IとL1Dの2つの部分に分割されます。 L1IはCPUの命令をキャッシュするために使用され、L1Dはそれらの命令が実行されるデータをキャッシュするために使用されます。

通常、各CPUコアには、最新のCPUに独自のL2キャッシュがあります。 L2キャッシュはL1キャッシュよりも大きくて低速であり、主にL2キャッシュに収まらないデータを格納するために使用されます。 コアごとに専用のL2キャッシュを設定することで、キャッシュの競合を回避できます。 キャッシュの競合は、さまざまなコアが独自のワークロードのキャッシュスペースを要求するために戦う場所であり、重要なデータがキャッシュからクリアされる可能性があります。

L3キャッシュは通常、プロセッサのすべてのCPUコア間で共有されます。 繰り返しになりますが、L3キャッシュはL2キャッシュよりも低速ですが、安価で大きくなります。 共有キャッシュを提供することで、コアごとのキャッシュの低レベルで複製されるデータの量を減らすことができます。

ヒント:例として、キャッシュサイズでは、Intelのi9-9900Kにはコアあたり64KBのL1と256KBのL2キャッシュ(合計512KBのL1と2MBのL2)があり、16MBの共有L3キャッシュもあります。

CPUキャッシュはどのように使用されますか?

CPUキャッシュのすべてのレベルは、RAMからデータをキャッシュすることにより、プロセッサのパフォーマンスを高速化するために使用されます。 CPUがデータを要求すると、通常、データをできるだけ速く取得するために、最初にキャッシュレイヤーを検索します。 データがキャッシュヒットで見つかった場合、CPUはその処理を続行できます。 データがキャッシュにない場合、いわゆるキャッシュミスの場合、CPUはRAMをチェックし、データがキャッシュにない場合はハードドライブをチェックする必要があります。 パフォーマンスを最大化するために、常に高速レイヤーが最初にチェックされます。

CPUが必要なときに必要なデータをキャッシュに保持できるようにするために、キャッシュはCPUが次に必要とする可能性のあるデータをプリエンプトしようとします。 たとえば、CPUが画像のデータを要求した場合、キャッシュをレンダリングすると、より多くの画像データをプリエンプティブにキャッシュして、CPUにできるだけ速くフィードできるようにすることができます。