C缓存模拟器初始化问题

时间:2013-12-15 17:28:39

标签: c caching memory simulator allocation

我必须在C中为我的计算机体系结构类编写缓存模拟器。我对我的要求没有任何问题,我的程序即将完成,但是我的CreateCache方法存在问题。出于某种原因,在我创建缓存之后,当我通过索引和标记将单个地址插入缓存时,缓存中的每个集/块都是相同的。如果我在4组缓存中向第1组添加一个条目,则所有4个组将具有相同的标记。我的缓存需要能够支持关联(n路)和直接,还必须包括L1 L2和L3内存。

如果有人可以请看看我的方法和结构并告诉我是否有任何明显的错误我会非常感激。我被困在这几天,明天就要完成任务。提前谢谢大家!!

这是我正在使用的结构,以及createCache方法。

    typedef struct block {
    unsigned long tag;
    int valid; //0 for invalid, 1 valid
}block;

typedef struct set {
    int numBlocks;
    block *blks;
    int alg;
}set;


typedef struct Cache{
    int FIFO, LRU; //index for alg
    int hits, misses, reads, writes;
    unsigned long accesses;
    int cacheSize;
    int numSets;
    int numBlocks; //total blocks
    set *sets;
    int blockSize;
    int assoc;  //number of lines each in set
    int alg;
}Cache;

这是我正在使用的createCache方法。我认为错误在于我如何使用指针并设置集合和块的数组。

Cache createCache(int cacheSize, int blockSize, int alg, int assoc){
    if(cacheSize<=0 || blockSize <=0 || (alg!=0 && alg!=1)){
        perror("Invalid input!");
        exit;
    }
    Cache *new = (Cache*)malloc(sizeof(Cache));
    //initialize all values
    new->hits=0;
    new->misses=0;
    new->reads=0;
    new->writes=0;
    new->alg=alg;
    new->assoc = assoc;
    new->cacheSize=cacheSize;
    new->blockSize=blockSize;
    new->numBlocks=(int)(cacheSize/blockSize);
    new->numSets=(int)(new->numBlocks/assoc);
   // new->set->blk = (block*)malloc(sizeof(block)* new->numSets);
        //creates array with n sets
    if(assoc >= 1){
            set *s = malloc(sizeof(set));
            block *b = malloc(sizeof(block));
            new->sets = s;
            new->sets->blks = b;

            //for each set
            for(int x=0; x < new->numSets; x++){
                new->sets[x] = *s;
                new->sets[x].alg=alg;
                new->sets[x].numBlocks = new->numBlocks;
              //  new->sets[x] = (set*)malloc(sizeof((set* new->numLines);
                for(int y=0; y < assoc; y++){
                    //add for blks[y]
                    new->sets[x].blks[y] = *b;
                    new->sets[x].blks[y].valid = -1;
                    new->sets[x].blks[y].tag = NULL;  //null?
                }
            }
        }//end if
    return *new;
}

为了更容易可视化,这是我打印缓存时会发生的情况。对于这个例子,我做了一个直接缓存,并在缓存中添加了一个地址。

Set 0
 Block 0
 tag 0
Set 1
 Block 0
 tag 0
Set 2
 Block 0
 tag 0
Set 3
 Block 0
 tag 0


Adding address:  7fff006891a8


Set 0
 Block 0
 tag 7fff006891a
Set 1
 Block 0
 tag 7fff006891a
Set 2
 Block 0
 tag 7fff006891a
Set 3
 Block 0
 tag 7fff006891a

1 个答案:

答案 0 :(得分:0)

  

我分配的for循环中是否存在我做错的事情   new-&gt;的值设置[x] = * s?

准...自设置new->sets = s后,对于 x = 0 new->sets[x] = *s相当于*s = *s。 主要错误是您将所有blks的{​​{1}}指针设置为同一new->sets(通过将block *b复制到的每个*s x = 0 numSets-1 )。正确的初始化将是:

new->sets[x]