質問: cpuがデータをl1iとl1dのどちらに配置するかを決定する方法 cpuは、メモリから取得したばかりのデータを格納するために使用するキャッシュをどのように決定しますか?私の知る限り、cpuがアクセス(読み取りまたは書き込み)できるメモリの最小単位は64バイト(x86_64、ddr3/ddr4)で、8回の転送(64ビットx 8回)のバーストで送信されます。この64bユニットは、到着するとすぐにl1に格納されるためキャッシュラインと呼ばれます(各エントリは64b +タグです)。コンパイルされたコードは命令でいっぱいで、データはインターリーブされています-多くの命令は命令自体の一部としてデータを持っています-オペコードの後に即時データが続きます。これは全体が命令と見なされ、l1iに格納されますか? l1iとl1dの両方のエントリは64b幅ですか?キャッシュライン全体がl1iまたはl1dのいずれかに保存されていますか?それとも、cpuがcの.dataセグメントを認識していて、プログラムのその部分からのデータのみがl1dに格納されているということですか?もしそうなら、それはどのように知っていますか?
回答: cpuは、メモリから取得したばかりのデータを格納するために使用するキャッシュをどのように決定しますか? cpuは、使用するキャッシュを"decide"にする必要はありません。キャッシュの割り当ては、プロセッサのキャッシュロジックに組み込まれています。 cpuは、各メモリアクセスの理由と目的を認識しています。 コンパイルされたコードは、インターリーブされた命令とデータでいっぱいです... それは誤ったアサーションです。 コードセクションとデータセクションをブレンドしたコンピューターを使用しましたが、それはマイクロプロセッサーの登場よりも前のものでした。 最新のcpuアーキテクチャは、ハードウェアスタックを使用して、再帰とシリアル再入可能コードを容易にします。 最新のツールチェーンは、コード共有を容易にするために、個別のテキスト(つまりコード)とデータセクションを生成します。ハーバードコンピュータアーキテクチャの顕著な特徴は、コードとデータ用の個別のメモリです。 最も広く使用されているコンピューターは、プリンストンまたはフォンノイマンアーキテクチャに準拠していますが、現代の傾向は、ハーバードアーキテクチャの側面を組み込むことです。 命令とデータに別々のキャッシュを使用すること(ただし、単一のメインメモリアドレス空間)は明らかな例です。 ...多くの命令には、命令自体の一部としてデータが含まれています。オペコードの後に直接データが続きます。 これは、命令フォーマットの不正確な説明です。 cpu命令は、オペコードと0個以上のオペランドで構成されています。 haltなどのオペコードにはオペランドがありません。 オペランドは、レジスターの内容への参照、またはオペランド自体の値(別名、即値またはリテラル値)である可能性があります。このような命令は、(データ)メモリ操作を生成しません。 オペランドは、メモリアドレス、メモリアドレスとしてのレジスタの内容への参照、またはアドレスオフセットの場合があります。メモリアドレスの計算を指定するために、アドレスモードやレジスタに追加のオペランドが存在する可能性があります。このような命令は、(データ)メモリ操作wh en実行を生成します。 これは全体が命令と見なされ、l1iに格納されますか? 命令は、オペコードと0個以上のオペランドで構成されます。 命令がデコードされるまで(特に固定長 risc命令の場合)、命令のオペランド部分は謎であり、キャッシュロジックによって分離できませんでした。 もちろん、命令全体を単一のエンティティとして保持する必要があり、(命令が実行されるまで)データキャッシュに関与することはありません。命令キャッシュは、命令としてフェッチされたメモリ位置のみを保持します。 これらの命令のメモリアドレスは、pc(プログラムカウンタレジスタ)によって指定されます。 cpuが分岐予測ロジックを採用している場合、それは命令のアドレスの別のソースである可能性があります。他のすべてのメモリ参照は、データへのアクセスと見なされます。 私の知る限り、cpuがアクセス(読み取りまたは書き込み)できるメモリの最小単位は64バイト(x86_64、ddr3/ddr4)で、8回の転送(64ビットx 8回)のバーストで送信されます。この64bユニットは、到着するとすぐにl1に格納されるためキャッシュラインと呼ばれます(各エントリは64b +タグです)。 .。 l1iとl1dの両方のエントリの幅は64bですか?キャッシュライン全体がl1iまたはl1dのいずれかに保存されていますか? キャッシュサイズはcpuの実装に依存します。 そのような仕様について一般化しようとすると不正確になります。 他にも多くの(最新の)cpuアーキテクチャと実装があり、あなたが説明したり主張したりするものとは似ていません"know"。 それとも、cpuがcの.dataセグメントを認識していて、プログラムのその部分からのデータのみがl1dに格納されているということですか?もしそうなら、それはどのように知っていますか? いいえ、cpuはメモリ構成を認識していませんが、メモリアクセスの理由と目的を認識しています。 プログラムカウンタ(pc)レジスタ(およびその他の可能なロジック)からのアドレスを使用するメモリアクセスは命令用であり、命令キャッシュを利用します。 命令のexecutionは、データのメモリアクセスを生成でき、そのメモリアクセスはデータキャッシュを利用します。 コードとデータがソフトウェア生成ツールによって分離されていなくても、読み取り/書き込みデータキャッシュが読み取り専用命令キャッシュと重複している場合は予測できない結果が発生しますが、cpuは別々のコードキャッシュとデータキャッシュを使用できます。 。