0

cache.cファイルでLRUコードを探していますが、これが私が見つけることができる唯一のコードです。

switch (cp->policy) {

  case LRU:

  case FIFO:

    repl = cp->sets[set].way_tail;
    update_way_list(&cp->sets[set], repl, Head);
    break;

私にはLRUコードが欠落しているように見えますが、コロンの直後にLRUアルゴリズムを配置する必要があると思いました。それで、私が何かを逃した場合、あなたは私を正しい方向に向けるか、私にいくつかのヒントを与えることができますか?

どうもありがとうございます。

4

3 に答える 3

2

残りのコードを見ずに言うのは難しいですが、ここで2つの明らかな可能性があります。1つは、ご提案のとおり、LRU管理のコードが欠落していることです。おそらく、編集の間違いなどが原因です。

ただし、コードのこの特定の部分では、LRUとFIFOの管理が同じことを行うため、Cスイッチステートメントの「フォールスルー」に依存して、この場合、両方に対して同じコードが実行されます(ただし、おそらく他のコードは他のポリシーに対して実行されます)。

于 2012-03-15T22:13:00.160 に答える
1

以前、たまたまSimplescalarを使用していました。実際、Simplescalarはすでに真のLRUアルゴリズムを実装しています。

次のコメントは、関数update_way_listを明確に説明しています。

/* insert BLK into the order way chain in SET at location WHERE */
static void
update_way_list(struct cache_set_t *set,        /* set contained way chain */
                struct cache_blk_t *blk,        /* block to insert */
                enum list_loc_t where)          /* insert location */

引用したコードは、キャッシュにアクセスしたときの「キャッシュミス」の場合のものです。

  switch (cp->policy) {
  case LRU:
  case FIFO:
    repl = cp->sets[set].way_tail;
    update_way_list(&cp->sets[set], repl, Head);
    break;
  }

ここでは、セットの最後の方法が犠牲者として選択され、セットのヘッドに移動されます。その後、置き換えられたブロックデータが書き戻され、被害者は新しいデータブロックに置き換えられます。

LRUとFIFOを区別する最も重要な部分は、「キャッシュヒット」の場合に由来します。

  /* if LRU replacement and this is not the first element of list, reorder */
  if (blk->way_prev && cp->policy == LRU)
    {
      /* move this block to head of the way (MRU) list */
      update_way_list(&cp->sets[set], blk, Head);
    }

したがって、セット内の方法は、年齢の降順に従います。セットの先頭はMRU(最も最近使用された)ブロックであり、末尾はLRUです。

これはまさに真のLRUアルゴリズムです。キャッシュヒットが発生すると、ヒットブロックは他の順序を維持しながらMRUウェイにプロモートされます。キャッシュミスがある場合、LRUブロックが犠牲者として選択され、新しいブロックがMRU方式で配置されます。以前の「キャッシュヒット」コードを削除すると、アクセス履歴は記録されず、セット内のウェイはアクセス順序に従っているため、FIFOの動作が提供されます。行を削除すると

    update_way_list(&cp->sets[set], repl, Head);

前の「キャッシュミス」コードでは、新しいブロックがLRU方式で配置されるため、LIP(LRU挿入ポリシー)動作が提供されます。

于 2013-05-12T16:29:15.627 に答える
0

cp->setsコードの他のセクションでは、FIFOまたはLRUの順序でエントリが順序付けられているように見えます。そのため、置換されるセットcp->sets[set].way_tailは、置換ポリシーが何であっても常に異なります。2つの置換ポリシーは、回線が使用または追加された場合にのみ異なり、回線が置換された場合には異なりません。

于 2012-03-15T22:59:11.987 に答える