2012-03-15 12 views
0

コロンの直後にLRUアルゴリズムを置くべきです。だから私が何かを見逃してしまったら、私に正しい方向に向けるか、いくつかのヒントを教えてもらえますか?SimplescalarキャッシュLRU実装

ありがとうございました。

+0

私は状況を理解しています:あなたはいくつかのコードを読んでいましたが、その一部は見付かりません。しかし、私はその質問が何であるか理解していません。なぜあなたはそれについてのコードの作者に尋ねないのですか? –

答えて

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; 
    } 

セットの頭。 後で置き換えられたブロックデータが書き戻され、その後、被害者が新しいデータブロックに置き換えられます。セットの頭部がある:

/* 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); 
    } 

したがって、セット内の方法は、年齢の高い順以下の通りです:LRUとFIFOを区別

最も重要な部分は、「キャッシュヒット」ケースから来ていますテールがLRUである間にMRU(Most Recently Used)ブロック。

これはまさに真のLRUアルゴリズムです。キャッシュヒットがあると、ヒットブロックはMRUの方法に昇格され、他の順番は維持されます。キャッシュ・ミスがあると、LRUブロックがターゲットとして選択され、新しいブロックがMRUの方法で配置されます。以前の「キャッシュヒット」コードを削除した場合、アクセス履歴は記録されず、セット内のウェイはアクセス順に従っているため、FIFOの動作が提供されます。我々は以前、「キャッシュミス」のコードで

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

行を削除した場合、新しいブロックは、このようにLIP(LRU挿入ポリシー)動作を提供する、LRUの方法で配置されます。

2

残りのコードを見ずに言うのは難しいですが、ここでは2つの可能性があります。 1つは、あなたが示唆しているように、おそらく編集ミスのようなものを通して、LRU管理のコードが欠落していることです。

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

+0

もう2番目のケースに似ています。コードの残りの部分をチェックしてください。どうもありがとうございました。 – astr627

+0

空の 'case'ラベル(この例では' LRU')の後に '/ * fall-through * /'コメントを置くという規則があります。それは意図をはっきりさせます。つまり、著者は 'break'ステートメントを忘れませんでした。 – gcbenison

0

のエントリをFIFO順またはLRU順に並べ替えるように、置き換えられるポリシーが何であるにせよ、置換するセットは常にcp->sets[set].way_tailになります。 2つの置換ポリシーは、回線が使用または追加された場合にのみ異なり、回線が交換されるときには異なりません。

関連する問題