回答:
実際にはいくつかの理由があります。
おそらく何よりもまず、命令キャッシュに格納されるデータは、一般的にデータキャッシュに格納されるデータとは多少異なります-命令自体とともに、デコーダーを支援するために、次の命令が始まる場所などの注釈があります。一部のプロセッサ(たとえば、Netburst、一部のSPARC)は、元の命令をエンコードされた形式で保存するのではなく、命令のデコード結果を保存する「トレースキャッシュ」を使用します。
次に、回路を少し簡素化します。データキャッシュは読み取りと書き込みを処理する必要がありますが、命令キャッシュは読み取りのみを処理します。(これは、自己変更コードが非常に高価な理由の一部です-命令キャッシュ内のデータを直接上書きする代わりに、書き込みはデータキャッシュを介してL2キャッシュに進み、その後命令キャッシュ内のラインが無効化されて再-L2からロード)。
第三に、帯域幅が増加します。最新のプロセッサのほとんどは、命令キャッシュとデータキャッシュから同時にデータを読み取ることができます。また、ほとんどはキャッシュへの「入り口」にキューを持っているため、任意のサイクルで実際に2回の読み取りと1回の書き込みを行うことができます。
第4に、電力を節約できます。内容を維持するためにメモリセル自体への電力を維持する必要がありますが、一部のプロセッサは、使用されていないときに関連する回路(デコーダーなど)の一部をパワーダウンできます。個別のキャッシュを使用すると、命令とデータのためにこれらの回路を個別に起動できるため、特定のサイクル中に回路に電源が供給されないままになる可能性が高くなります(x86プロセッサがこれを行うかどうかはわかりません-AFAIK、より多くのARM事)。
不動産と同様に、キャッシュの使用は、場所、場所、場所の3つの要素によって決まります。キャッシュを持つことのポイントは、ほとんどのプログラムが場所のパターンを示すことです。バイト1111111にアクセスする場合、アクセスする次のバイトはおそらく1111110または1111112であり、バイト9999999はそれほど多くありません。指示とデータの場所のパターン。これは、命令とデータがキャッシュを効率的に共有できる可能性が低いことを意味します。なぜなら、命令とデータは必ずしもメモリ内で互いに近くにあるとは限らないからです。データアクセスはキャッシュから命令をバンプし、ロード命令はキャッシュからデータをバンプします。