命令キャッシュとデータキャッシュを別々にすることで何が得られるかを誰かに説明してもらえますか?これを説明する良いリンクへのポインタも高く評価されます。
5 に答える
主な理由は次のとおりです。パフォーマンス。もう1つの理由は消費電力です。
dCacheとiCacheを分離すると、命令とデータを並行してフェッチできます。
命令とデータには異なるアクセスパターンがあります。
iCacheへの書き込みはまれです。CPU設計者は、コードの変更がまれであるという前提に基づいて、iCacheとCPUアーキテクチャを最適化しています。たとえば、10hおよび12hプロセッサ用のAMDソフトウェア最適化ガイドには次のように記載されています。
L1命令キャッシュがいっぱいになると、プリデコードが開始されます。事前デコード情報が生成され、命令キャッシュと一緒に保存されます。
Intel Nehalem CPUはループバックバッファを備えており、これに加えて、Sandy Bridge CPUはµopキャッシュを備えています。Intel 、AMD、およびVIACPUのマイクロアーキテクチャ。これらはコードに関連する機能であり、データに直接対応するものはないことに注意してください。これらはパフォーマンスにメリットがあり、IntelはCPU設計者が消費電力を過度に増加させる機能を導入することを「禁止」しているため、おそらく総消費電力にもメリットがあります。
ほとんどのCPUは、データ転送ネットワーク(ストアからロードへの転送)を備えています。コードがデータよりもはるかに少ない頻度で変更されているという理由だけで、コードに関連する「ストアからロードへの転送」はありません。
コードはデータとは異なるパターンを示します。
とは言うものの、最近のほとんどのCPUは、コードとデータの両方を保持する統合L2キャッシュを備えています。この理由は、L2IキャッシュとL2Dキャッシュを別々にすると、トランジスタのバジェットを無意味に消費する一方で、測定可能なパフォーマンスの向上を実現できないためです。
(確かに、iCacheとdCacheを別々に使用する理由は、複雑さが軽減されるわけではありません。理由が、現在のCPU設計にパイプラインがない場合よりも複雑さが軽減されるためです。パイプラインを使用するCPUは、使用しないCPUよりも複雑です。パイプライン処理。複雑さを増したいのですが、実際のところ、次のCPU設計は(通常)前の設計よりも複雑です。)
これは、CPUのどの機能ユニットが主にそのキャッシュにアクセスするかと関係があります。ALUとFPUは、デコーダとスケジューラが命令キャッシュにアクセスするデータキャッシュにアクセスし、多くの場合、パイプラインによって命令プロセッサと実行ユニットが同時に動作できるため、単一のキャッシュを使用すると、これら2つのコンポーネント間で競合が発生します。それらを分離することにより、柔軟性が失われ、プロセッサのこれら2つの主要コンポーネントがキャッシュからデータを同時にフェッチできるようになります。
理由の1つは、複雑さが軽減されることです。一度に複数の行を取得できる共有キャッシュを実装することも、非同期で実装することもできますが(Hit-Under-Missを参照)、キャッシュコントローラーがはるかに複雑になります。
もう1つの理由は、実行の安定性です。既知の量のicacheとdcacheがある場合、データのキャッシュによってキャッシュシステムの命令が不足することはありません。これは、単純な共有キャッシュで発生する可能性があります。
そして、ダンが述べたように、それらを分離することで、コントローラーの複雑さを増すことなく、パイプライン化が容易になります。
プロセッサのMEMステージとFETCHステージはL1キャッシュに同時にアクセスできるため(結合されていると想定)、どちらを優先するかが競合する可能性があります(パフォーマンスのボトルネックになる可能性があります)。これを解決する1つの方法は、2つの読み取りポートを使用してL1キャッシュを作成することです。ただし、ポートの数を増やすと、キャッシュ領域が2次的に増加するため、消費電力が増加します。
また、L1キャッシュが組み合わされたものである場合、一部のデータブロックが、重要でアクセスされようとしている命令を含むブロックを置き換える可能性があります。これらの削除とそれに続くキャッシュミスは、全体的なパフォーマンスを損なう可能性があります。
また、ほとんどの場合、プロセッサは命令を順番にフェッチします(ターゲットの取得、ジャンプなどの例外はほとんどありません)。これにより、命令キャッシュの空間的な局所性が高まり、ヒット率が高くなります。また、他の回答で述べたように、ICache(JITコンパイラなどの自己変更コード)への書き込みはほとんどありません。したがって、個別のicacheとdcacheの設計は、アクセスパターンや、ロード/ストアキュー、書き込みバッファなどの他のコンポーネントを考慮して最適化できます。
アーキテクチャには、一般的に2種類あります。1。フォンノイマンアーキテクチャと2.ハーバードアーキテクチャです。ハーバードアーキテクチャは、2つの別々のメモリを使用します。これについて詳しくは、このアームページhttp://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/ka3839.htmlをご覧ください。