2

ページ サイズが 1KB であると仮定して、次のコード スニペットのようなコードで TLB ミスの数を計算するにはどうすればよいですか。

int i;
int p[1024];
for (i=0; i<1024; i++)
    p[i]=0;

この#TLBミスを知ることに加えて、ほぼすべての特定のコードスニペットでTLBミスの数を計算できる一般的なルールを知ることに興味があります。

4

1 に答える 1

3

単純な答えはあり得ません。答えはプロセッサごとに大きく異なります。まず、TLB のサイズ (エントリ数) が同じではありません。第二に、プロセッサはアルゴリズムを使用して、より価値のあるエントリを保持し (そうであると信じているため)、他のエントリを破棄する傾向があります。これらのアルゴリズムは公開されません。

それに加えて、TLB の一部は命令の読み取りに使用され、何かが OS によって使用されます。これは、正確な結果を知ることができないことを意味します。

ウィキペディアには次の情報が記載されています。

  • サイズ: 12 ~ 4,096 エントリ。
  • ヒット時間: 0.5 - 1 クロック サイクル。
  • ミス ペナルティ: 10 ~ 100 クロック サイクル。
  • ミス率: 0.01 - 1%。

あなたの例では、1024 個の 4 バイト整数の配列では、5 ページが必要になります。これは、配列がページ境界で整列されない可能性が高いためです。各ページは、ループでアクセスされると、TLB にその場所を取得します。この初期配置は TLB ミスとして扱うことができますか? 私の知る限り、明確な答えはありません。はいと答える人もいれば、いいえと答える人もいます。いいえと答えます。

TLB のサイズがすべてのページを格納するのに十分でない場合 (アルゴリズムで要求される)、これは間違いなく TLB ミスと呼ばれます。あなたの場合、TLB に 2 つのエントリしかない場合、3 つのミスが発生します。

于 2013-10-27T02:54:54.157 に答える