-1

CI では、4 セットのダイレクト マップ キャッシュで整数アドレス値をタグ ビットとセット インデックス ビットに分離しようとしています。これを行うのは、キャッシュの正しいセットの行で正しいタグを比較できるようにするためです。たとえば、アドレスパラメータは次のとおりです。

  • セットインデックスビット数 s=2
  • オフセットビット数 b=3
  • アドレスビットの総数 m=8

私の例では、アドレス整数は 40 -- int address = 40 です。

  • 2 進数で 40 は 00101000 です
  • セットインデックスは 01 = 1 である必要があります
  • タグは 001 = 1 である必要があります

タグの代わりに 2 を取得しています。セット インデックスは 8 です。これは、キャッシュに 4 セットしかないため、間違っている必要があります。

これが私がやっている方法です。タグを取得するためにアドレスをビットマスキングしています。これは、m = 8ビットまでのセットインデックスの左側のビットです。セット インデックスは、8 ビット シーケンスの中央にある 01 であるタグ ビットとオフセット ビットの間にあります。

  • int タグ = ((アドレス & ~0 << (s + b)) >> 4)
  • int set = (アドレス & (~(~0 << s) << b))

自分が間違っているに違いないことはわかっていますが、マスクを書こうとすればするほど混乱し、何かを忘れているに違いありません。左のビットは中央のビットを取得するよりも簡単なはずなので、少なくともタグを正しく取得していると思いました。アドバイスやヘルプをいただければ幸いです。どうもありがとうございました。

4

1 に答える 1

1

これらの方程式はあなたのために働くでしょう:

tag = (address >> 5) & 0x7;
set = (address >> 3) & 0x3;

s変数、b、およびを使用する場合m:

tag = (address >> (m-b))   & ((1u << b)-1);
set = (address >> (m-b-s)) & ((1u << s)-1);

N一般に、 bit から始まるビットを抽出したい場合i:

bits = (value >> i) & ((1u << N)-1);
于 2014-11-14T04:09:40.620 に答える