ページ サイズが 1KB であると仮定して、次のコード スニペットのようなコードで TLB ミスの数を計算するにはどうすればよいですか。
int i;
int p[1024];
for (i=0; i<1024; i++)
p[i]=0;
この#TLBミスを知ることに加えて、ほぼすべての特定のコードスニペットでTLBミスの数を計算できる一般的なルールを知ることに興味があります。
ページ サイズが 1KB であると仮定して、次のコード スニペットのようなコードで TLB ミスの数を計算するにはどうすればよいですか。
int i;
int p[1024];
for (i=0; i<1024; i++)
p[i]=0;
この#TLBミスを知ることに加えて、ほぼすべての特定のコードスニペットでTLBミスの数を計算できる一般的なルールを知ることに興味があります。
単純な答えはあり得ません。答えはプロセッサごとに大きく異なります。まず、TLB のサイズ (エントリ数) が同じではありません。第二に、プロセッサはアルゴリズムを使用して、より価値のあるエントリを保持し (そうであると信じているため)、他のエントリを破棄する傾向があります。これらのアルゴリズムは公開されません。
それに加えて、TLB の一部は命令の読み取りに使用され、何かが OS によって使用されます。これは、正確な結果を知ることができないことを意味します。
ウィキペディアには次の情報が記載されています。
あなたの例では、1024 個の 4 バイト整数の配列では、5 ページが必要になります。これは、配列がページ境界で整列されない可能性が高いためです。各ページは、ループでアクセスされると、TLB にその場所を取得します。この初期配置は TLB ミスとして扱うことができますか? 私の知る限り、明確な答えはありません。はいと答える人もいれば、いいえと答える人もいます。いいえと答えます。
TLB のサイズがすべてのページを格納するのに十分でない場合 (アルゴリズムで要求される)、これは間違いなく TLB ミスと呼ばれます。あなたの場合、TLB に 2 つのエントリしかない場合、3 つのミスが発生します。