1

私はキャッシングにかなり慣れていないので、誰かがこの方法を理解するのを手伝ってくれるかどうか疑問に思っていました. 実際に cacheblock ポインタ全体を返す場合、どのようにタグを取得しますか? ここで *bIndex は何をしていて、その省略形は何を意味していますか?

cacheBlock* getTag(int index, int tag, int *bIndex) {
  int i;

  for (i = 0; i < assoc; i ++ ) {   
    if (cache[index].block[i].tag == tag) {
      cacheBlock *targetBlock = &cache[index].block[i];
      *bIndex = i;
      return targetBlock;
    }
  }
  *bIndex = -1;
  return NULL;
}
4

3 に答える 3

1

以下の分析:

cacheBlock* getTag(int index, int tag, int *bIndex) 
{
  int i;

  // walk all blocks in cache[index] block[] table
  for (i = 0; i < assoc; i ++ ) 
  {
    // if the block association at this index matches this tag,
    //  then the block we're looking for is in the cache.   
    if (cache[index].block[i].tag == tag) 
    {
      // setup return value (this is unneeded, btw. simply setting
      //  *bIndex and returning (cache[index].block+i) would work).
      cacheBlock *targetBlock = &cache[index].block[i];

      // set out-param to inform them which block[i].tag matched in the
      //  block being returned by address. either this is actually not
      //  needed, or this is a bug, since we already return the precise
      //  block[i] entry by address (see above). the caller may like
      //  knowing *which* block[] entry matched for whatever reason.
      *bIndex = i;

      // return the matching cache[index].block[i] address
      return targetBlock;
    }
  }

  // no match condition. set offset to (-1) and return NULL.
  *bIndex = -1;
  return NULL;
}

そうは言っても、このコードの呼び出し元を確認する必要があると思います。受信している block[] エントリは、探していた正確な一致にすでにオフセットされているためです。つまり、返されたポインタは *bIndex オフセットを必要としません。リターンアドレスからのインデックスオフセットに使用する場合、つまり、次のようなコードがあります。

int bIndex = 0;
cacheBlock *pEntry = getTag(cache, tag, &bIndex);
if (pEntry != NULL)
{
    // do something with pEntry[bIndex]
}

おそらくバグであり、おそらく彼らcache[index].blockは ではなくを返すつもりでしたcache[index].block+i

于 2012-11-09T16:01:44.397 に答える
0

関数が行っていることは、キャッシュ ブロックの配列を介して線形検索を実行することです。指定された整数タグ値に基づいて一致が見つかった場合は、1 つへのポインターを返します。おそらく、コメントが役立つかもしれません:

cacheBlock* getTag(int index, int tag, int *bIndex) {
 int i;

 // The following iterates/increments through all? blocks for
 // the given cache index.  The variable assoc is global to this
 // function and I assume represents the number of entries for
 // each cache index.
 for (i = 0; i < assoc; i ++ ) {   
   // Check to see if a given block matches the one identified
   // by the passed in variable tag.
   if (cache[index].block[i].tag == tag) {
     // It did match so we will grab the address of that block
     cacheBlock *targetBlock = &cache[index].block[i];
     // And return (via parameter) the position at which it was found
     *bIndex = i;
     // And now return the address of (pointer to) the block
     return targetBlock;
   }
 }
 // we did not find the given entry, so pass back -1 as the
 // index to signify that.  And return NULL also to
 // signify that it was not found.
 *bIndex = -1;
 return NULL;
}
于 2012-11-09T16:01:15.863 に答える
0

キャッシュの「グローバル」配列、static cacheControl cache[SOMESIZE];または同等のものcacheがあるようです (コードからはタイプを判別できません。固定配列ではなく、割り当てられたデータへのポインターである可能性があります)。検索対象のキャッシュ内のエントリは、 で識別されindexます。そのキャッシュ エントリ内には、タグ付きのキャッシュ ブロックがあります。このコードは、 として関数に渡されたタグ値によって識別されるキャッシュ ブロックの線形検索を行いますtag。このコードは、キャッシュ エントリ内のキャッシュ ブロックのリストを線形検索します (assocコードで定義されていないサイズによって制御されます — 不思議です)。関数の終了時に、 が指す整数にはbIndex、キャッシュ内のブロックのインデックス番号 (または -1) が含まれます。戻り値はキャッシュ ブロックへのポインタです。

于 2012-11-09T15:58:33.227 に答える