Caching 缓存模拟器写回vs WriteThrough和WriteAllocate vs WriteNoAllocate

Caching 缓存模拟器写回vs WriteThrough和WriteAllocate vs WriteNoAllocate,caching,Caching,我正在实现一个缓存模拟器,用户可以在其中指定write_allocate或write_no_allocate、write_back或write_through,以及其他变量,如关联性和块大小。我们不是跟踪“内存”,而是跟踪数据/指令访问、未命中和替换的数量 对于更简单的测试用例,我得到了正确的结果,但是对于更大的跟踪文件,这会发生变化。常见的错误是,我通常注册的未命中和替换太少(以相同的数字),因此显然,有时当它应该是未命中+替换时,它会将其解释为命中。我希望有人能检查一下我的逻辑:写回还是写通

我正在实现一个缓存模拟器,用户可以在其中指定write_allocate或write_no_allocate、write_back或write_through,以及其他变量,如关联性和块大小。我们不是跟踪“内存”,而是跟踪数据/指令访问、未命中和替换的数量

对于更简单的测试用例,我得到了正确的结果,但是对于更大的跟踪文件,这会发生变化。常见的错误是,我通常注册的未命中和替换太少(以相同的数字),因此显然,有时当它应该是未命中+替换时,它会将其解释为命中。我希望有人能检查一下我的逻辑:写回还是写通过,写分配还是写不分配。我的init、search、insert和delete方法肯定是正确的(我确信这一点),但让我头疼的是我的performacess方法。这里是我的指令加载伪代码,其中LRU头是缓存中每个集合的缓存线“头”数组,您可以使用索引指定所关心的集合

If(INSTRUCTION_LOAD){

inst_accesess++;
if(LRU_head[index] == NULL) //miss no replacement
    inst_misses++;
    constructed = makeLine(tag);
    //insert constructed into set with correct index

    else if (search == false){ //miss, maybe replacement
    inst_misses++;
    constructedLine = makeLine(tag);
    if(room_in_set(index) == true){
    //insert constructed into set with correct index
    }
    else{ //LRU line will be evicted to make room
    inst_replacements++;
    //delete an entry based on Least Recently Used
    //insert constructed into that now vacated spot
    }

    else{ //hit
    //delete and insert it to make it most recently used element for LRU purposes
    }
}
我想澄清的是,write_alloc vs write_no_allocate是否只会影响数据存储命令的未命中/替换,write_back vs write_through是否只会影响在刷新缓存或逐行以腾出空间时复制回内存的字?我得到了数据和指令命令的正确访问次数,但导致死亡的是未命中/替换,尽管我认为这些应该非常简单