2017-01-27 24 views
1

私はWhat every programmer should know about memoryを読んでおり、というCPUキャッシュタグ(15ページ)という概念に苦しんでいます。L1d CPUキャッシュタグはどこに格納されていますか?

私が正しく理解すれば、各CPUのキャッシュラインには、メインメモリ内のどのデータが対応するかを指定するタグがあります。つまり、特定の行に書き込む場合は、タグを使用して、RAMのどこにこの行の内容を書き込むべきかを調べます。逆に、RAMからL1キャッシュラインにデータを読み込む場合は、RAMアドレスからタグを計算し、どこかに格納して、L1キャッシュラインのデータがどこから来たのかを知ることができます。タグはポインタのようなものです。

このタグ自体がキャッシュラインのどこかに書かれているのか、タグを保存するためのL1キャッシュの隣に特別なメモリがあるのか​​質問したいと思いますか?

私のシステムでは、L1ラインサイズは64バイトであり、ポンターは8バイトです。私のプログラムで繰り返し頻繁に繰り返されるオブジェクトを64バイト以下にすることを目指すべきですか?または、タグのサイズがポインタのサイズより大きくならないように、56バイトを目標にする必要がありますか?

答えて

3

キャッシュはメインメモリより小さい。したがって、多数のメインメモリエントリをより少数のキャッシュエントリにマップするメカニズムが必要です。これを効率的かつ安価に行うために、ほとんどのキャッシュでは、キャッシュエントリのインデックスを作成するために、アドレスから最下位ビットのうちのいくつかを使用します(10とします)。少なくとも10ビットのアドレスを選択すると、キャッシュには1024のエントリがあります。また、同じ10ビット以上の複数のメモリアドレスが存在する可能性が高くなります。したがって、同じ10ビット以上の異なるメモリアドレスを区別する必要があります。だから、このタグはこれに役立つために行動に入る。キャッシュにデータを格納する場合、エントリは10ビット以上を使用して選択されます。そして、キャッシュラインを2つのフィールドを持つエントリとして考えると、最初はアドレスビットの残りの部分を格納するタグであり、2番目のフィールドはデータを格納する場所です。

誰かが(自分の場合の64バイトのように)キャッシュ行がxxxバイトであると言うと、データ部分だけを意味します。したがって、データをキャッシュラインで整列させたい場合は、56バイトではなく64バイトにする必要があります。

同じサイズになります。キャッシュのサイズが引用されている場合は、通常、データ部分全体のサイズを意味します。実際のサイズは、タグ、有効ビットなどの余分なブック保管のために少し大きくなります。

+0

ありがとうございました!つまり、キャッシュラインの実際のハードウェアサイズは64 + 1つのタグのサイズですか? –

+0

さらに、有効ビット、汚れたビットなどのような他のものの場合はもう少しです –

+0

エラー修正ビットと、さまざまなパフォーマンス調整のための追加情報(例:置換ポリシーの最新データ)。同じHW構造に存在する必要はなく、タグやデータは分割されることもあります。これは、ヒットしない限りデータにアクセスする必要さえないためです – Leeor

関連する問題