コロンの直後にLRUアルゴリズムを置くべきです。だから私が何かを見逃してしまったら、私に正しい方向に向けるか、いくつかのヒントを教えてもらえますか?SimplescalarキャッシュLRU実装
ありがとうございました。
コロンの直後にLRUアルゴリズムを置くべきです。だから私が何かを見逃してしまったら、私に正しい方向に向けるか、いくつかのヒントを教えてもらえますか?SimplescalarキャッシュLRU実装
ありがとうございました。
私は以前に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つの可能性があります。 1つは、あなたが示唆しているように、おそらく編集ミスのようなものを通して、LRU管理のコードが欠落していることです。
しかし、コードのこの特定の部分では、LRUとFIFO管理が同じことをする可能性が高いので、Cスイッチの「フォールスルー」に依存している可能性がありますこの場合、同じコードを両方に対して実行するようにします(ただし、おそらく他のポリシーでは他のコードが実行されます)。
のエントリをFIFO順またはLRU順に並べ替えるように、置き換えられるポリシーが何であるにせよ、置換するセットは常にcp->sets[set].way_tail
になります。 2つの置換ポリシーは、回線が使用または追加された場合にのみ異なり、回線が交換されるときには異なりません。
私は状況を理解しています:あなたはいくつかのコードを読んでいましたが、その一部は見付かりません。しかし、私はその質問が何であるか理解していません。なぜあなたはそれについてのコードの作者に尋ねないのですか? –