4

私はこの問題を解決するために頭をぶつけていましたが、一歩も進むことができませんでした。質問は次のようなものです。

次の C プログラムを考えてみましょう。

int X[N];
int i;
int step = M; // M is some predefined constant
for (i = 0; i < N; i += step) X[i] = X[i] + 1;

ページ サイズが 4 KB で、TLB が 64 エントリのマシンでこのプログラムを実行した場合、内側のループを実行するたびに TLB ミスが発生する M と N の値はどれですか?

どうすれば解決できるのか、誰かヒントを教えてください。

4

2 に答える 2

8

簡単です。まず、TLB が正確に何をするのかを理解する必要があります。virtual addressヒントは、 への変換に役立つキャッシュであるということですphysical address。ページサイズが 4K バイトであることがわかります。したがって、配列がある場合、無限の長さと言えます。forループで0から無限にアクセスしています。配列 X[0] の最初のアクセスで TLB ミスが発生し、最初の TLB がロードされます。次の 4095 回のアクセスでは、TLB に存在するため、見落とされることはありません (これは、ページ サイズが 4096 = 4KB であるためです)。したがって、次のアドレスは X[4096] であり、TLB ミスが発生します。したがって、4096 のアドレス インクリメントごとに TLB ミスが発生することがわかります。だから私たちはそれを確信していM = 4096/sizeof(int)ます。

これで、64 エントリの TLB キャッシュがあることもわかりました。したがって、TLB の 64 エントリがロードされると、完全な TLB が作成されます。65 番目のエントリをロードするには、最初のエントリを削除する必要があります。(異なる置換メカニズムが存在する可能性があることに注意してください。ここでは、単純なメカニズムであると想定しています)。したがって、65 番目のエントリがロードされた後、X[0] にアクセスするときの最初のエントリが削除されます。そのため、ここで X[0] にアクセスしようとすると、TLB ミスが発生し、X[4096] などに必要なエントリが置き換えられます。64 * 4096 = 256 KBytesしたがって、TLB キャッシュを十分に活用するには、のサイズが必要です。ただし、すべてのステップで TLB キャッシュ ミスが必要です。したがって、64 エントリの TLB キャッシュの場合、65 エントリに相当する配列サイズが必要です。したがってN = 65 * 4096 / sizeof(int)

これがヒントになることを願っています!

于 2012-10-02T11:09:27.080 に答える
3

ページの仮想アドレスが TLB にない場合、TLB ミスが発生します。

64 エントリの TLB が与えられた場合、仮想アドレス 0*4096、1*4096、2*4096、...、63*4096 を完全に事前入力すると (関連するページのメモリにアクセスして入力します)、次に64*4096 から 64*4096+4095 までの仮想アドレスでアクセスを要求すると、そのアクセスによって TLB ミスが発生します (64*4096 はまだ TLB にないため)。

次に、アドレス 64*4096 が現在格納されているエントリ (TLB ミスに続いて、64 エントリの 1 つが削除され、仮想アドレス 64*4096 とそれに対応する物理アドレスに置き換えられる) が以前に格納されている場合仮想アドレス 0*4096 を持っていた場合、仮想アドレス 0 ~ 4095 のメモリにアクセスすると、別の TLB ミスが発生します (仮想アドレス 0*4096 のエントリが TLB から削除され、VA 64*4096 のエントリに置き換えられたため)。

TLB のこの動作に基づいて考え出す必要がMあり、Nそれは要件を満たします。

于 2012-10-02T11:12:36.220 に答える