質問

私の教授が書いたプログラムがあり、メモリがL2キャッシュに書き込む方法をシミュレートします。空白を埋めることになっている場所がいくつかあります。私が最初にすべきことは、各キャッシュエントリの有効なビットをクリアすることです。彼は私たちに以下を与えてくれました:

//number of cache entries (2^11)

#define L2_NUM_CACHE_ENTRIES (1<<11)

/***************************************************

This struct defines the structure of a single cache
entry in the L2 cache. It has the following fields:
v_d_tag: 32-bit unsigned word containing the
valid (v) bit at bit 31 (leftmost bit),
the dirty bit (d) at bit 30, and the tag
in bits 0 through 15 (the 16 rightmost bits)
cache_line: an array of 8 words, constituting a single
cache line.
****************************************************/

Typedef struct {

uint32_t v_d_tag;

uint32_t cache_line[WORDS_PER_CACHE_LINE];

} L2_CACHE_ENTRY;

//The L2 is just an array cache entries

L2_CACHE_ENTRY l2_cache[L2_NUM_CACHE_ENTRIES];

だから、私が理解しているように、有効なビットをクリアすることは、それをゼロに設定することを意味します。有効なビットはV_D_TAGのビット31なので、ビットマスクを使用する必要があります - 「V_D_TAG = V_D_TAG&0X80000000;」のラインに沿って何かをしたいと思いますか?しかし、私が理解していないのは、キャッシュエントリごとにどのように通過してそれを行うことができるかです。キャッシュエントリの配列(L2_Cache)が表示されますが、V_D_TAGがそれにどのように関連しているかはわかりません。

誰かが私にそれを説明できますか?

役に立ちましたか?

解決

typedef structはC ++で冗長です。 #define 私は見ています、それらは静的const intである可能性があります。

それらをすべてクリアするために、あなたはやりたいと思うでしょう

for(int i = 0; i < L2_NUM_CACHE_ENTRIES; i++)
    l2_cache[i].v_d_tag &= 0x80000000;

他のヒント

構造体はcファッションで定義されます。なぜなら、cでは、作成することなくタイプとして使用できるように構造体を宣言するのは一般的なイディオムであるため struct L2_CACHE_ENTRY すべての参照。このイディオムは、C ++ではもう必要ありません。 struct タグは個々のタイプとして機能します。

要するに、C ++では治療できます

typedef struct {

uint32_t v_d_tag;

uint32_t cache_line[WORDS_PER_CACHE_LINE];

} L2_CACHE_ENTRY;

まったく同じです

struct L2_CACHE_ENTRY{

uint32_t v_d_tag;

uint32_t cache_line[WORDS_PER_CACHE_LINE];

};
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top