base.cc

来自「M5,一个功能强大的多处理器系统模拟器.很多针对处理器架构,性能的研究都使用它作」· CC 代码 · 共 639 行 · 第 1/2 页

CC
639
字号
    blocked_cycles        .name(name() + ".blocked_cycles")        .desc("number of cycles access was blocked")        .subname(Blocked_NoMSHRs, "no_mshrs")        .subname(Blocked_NoTargets, "no_targets")        ;    blocked_causes.init(NUM_BLOCKED_CAUSES);    blocked_causes        .name(name() + ".blocked")        .desc("number of cycles access was blocked")        .subname(Blocked_NoMSHRs, "no_mshrs")        .subname(Blocked_NoTargets, "no_targets")        ;    avg_blocked        .name(name() + ".avg_blocked_cycles")        .desc("average number of cycles each access was blocked")        .subname(Blocked_NoMSHRs, "no_mshrs")        .subname(Blocked_NoTargets, "no_targets")        ;    avg_blocked = blocked_cycles / blocked_causes;    fastWrites        .name(name() + ".fast_writes")        .desc("number of fast writes performed")        ;    cacheCopies        .name(name() + ".cache_copies")        .desc("number of cache copies performed")        ;    writebacks        .init(maxThreadsPerCPU)        .name(name() + ".writebacks")        .desc("number of writebacks")        .flags(total)        ;    // MSHR statistics    // MSHR hit statistics    for (int access_idx = 0; access_idx < MemCmd::NUM_MEM_CMDS; ++access_idx) {        MemCmd cmd(access_idx);        const string &cstr = cmd.toString();        mshr_hits[access_idx]            .init(maxThreadsPerCPU)            .name(name() + "." + cstr + "_mshr_hits")            .desc("number of " + cstr + " MSHR hits")            .flags(total | nozero | nonan)            ;    }    demandMshrHits        .name(name() + ".demand_mshr_hits")        .desc("number of demand (read+write) MSHR hits")        .flags(total)        ;    demandMshrHits = SUM_DEMAND(mshr_hits);    overallMshrHits        .name(name() + ".overall_mshr_hits")        .desc("number of overall MSHR hits")        .flags(total)        ;    overallMshrHits = demandMshrHits + SUM_NON_DEMAND(mshr_hits);    // MSHR miss statistics    for (int access_idx = 0; access_idx < MemCmd::NUM_MEM_CMDS; ++access_idx) {        MemCmd cmd(access_idx);        const string &cstr = cmd.toString();        mshr_misses[access_idx]            .init(maxThreadsPerCPU)            .name(name() + "." + cstr + "_mshr_misses")            .desc("number of " + cstr + " MSHR misses")            .flags(total | nozero | nonan)            ;    }    demandMshrMisses        .name(name() + ".demand_mshr_misses")        .desc("number of demand (read+write) MSHR misses")        .flags(total)        ;    demandMshrMisses = SUM_DEMAND(mshr_misses);    overallMshrMisses        .name(name() + ".overall_mshr_misses")        .desc("number of overall MSHR misses")        .flags(total)        ;    overallMshrMisses = demandMshrMisses + SUM_NON_DEMAND(mshr_misses);    // MSHR miss latency statistics    for (int access_idx = 0; access_idx < MemCmd::NUM_MEM_CMDS; ++access_idx) {        MemCmd cmd(access_idx);        const string &cstr = cmd.toString();        mshr_miss_latency[access_idx]            .init(maxThreadsPerCPU)            .name(name() + "." + cstr + "_mshr_miss_latency")            .desc("number of " + cstr + " MSHR miss cycles")            .flags(total | nozero | nonan)            ;    }    demandMshrMissLatency        .name(name() + ".demand_mshr_miss_latency")        .desc("number of demand (read+write) MSHR miss cycles")        .flags(total)        ;    demandMshrMissLatency = SUM_DEMAND(mshr_miss_latency);    overallMshrMissLatency        .name(name() + ".overall_mshr_miss_latency")        .desc("number of overall MSHR miss cycles")        .flags(total)        ;    overallMshrMissLatency =        demandMshrMissLatency + SUM_NON_DEMAND(mshr_miss_latency);    // MSHR uncacheable statistics    for (int access_idx = 0; access_idx < MemCmd::NUM_MEM_CMDS; ++access_idx) {        MemCmd cmd(access_idx);        const string &cstr = cmd.toString();        mshr_uncacheable[access_idx]            .init(maxThreadsPerCPU)            .name(name() + "." + cstr + "_mshr_uncacheable")            .desc("number of " + cstr + " MSHR uncacheable")            .flags(total | nozero | nonan)            ;    }    overallMshrUncacheable        .name(name() + ".overall_mshr_uncacheable_misses")        .desc("number of overall MSHR uncacheable misses")        .flags(total)        ;    overallMshrUncacheable =        SUM_DEMAND(mshr_uncacheable) + SUM_NON_DEMAND(mshr_uncacheable);    // MSHR miss latency statistics    for (int access_idx = 0; access_idx < MemCmd::NUM_MEM_CMDS; ++access_idx) {        MemCmd cmd(access_idx);        const string &cstr = cmd.toString();        mshr_uncacheable_lat[access_idx]            .init(maxThreadsPerCPU)            .name(name() + "." + cstr + "_mshr_uncacheable_latency")            .desc("number of " + cstr + " MSHR uncacheable cycles")            .flags(total | nozero | nonan)            ;    }    overallMshrUncacheableLatency        .name(name() + ".overall_mshr_uncacheable_latency")        .desc("number of overall MSHR uncacheable cycles")        .flags(total)        ;    overallMshrUncacheableLatency =        SUM_DEMAND(mshr_uncacheable_lat) +        SUM_NON_DEMAND(mshr_uncacheable_lat);#if 0    // MSHR access formulas    for (int access_idx = 0; access_idx < MemCmd::NUM_MEM_CMDS; ++access_idx) {        MemCmd cmd(access_idx);        const string &cstr = cmd.toString();        mshrAccesses[access_idx]            .name(name() + "." + cstr + "_mshr_accesses")            .desc("number of " + cstr + " mshr accesses(hits+misses)")            .flags(total | nozero | nonan)            ;        mshrAccesses[access_idx] =            mshr_hits[access_idx] + mshr_misses[access_idx]            + mshr_uncacheable[access_idx];    }    demandMshrAccesses        .name(name() + ".demand_mshr_accesses")        .desc("number of demand (read+write) mshr accesses")        .flags(total | nozero | nonan)        ;    demandMshrAccesses = demandMshrHits + demandMshrMisses;    overallMshrAccesses        .name(name() + ".overall_mshr_accesses")        .desc("number of overall (read+write) mshr accesses")        .flags(total | nozero | nonan)        ;    overallMshrAccesses = overallMshrHits + overallMshrMisses        + overallMshrUncacheable;#endif    // MSHR miss rate formulas    for (int access_idx = 0; access_idx < MemCmd::NUM_MEM_CMDS; ++access_idx) {        MemCmd cmd(access_idx);        const string &cstr = cmd.toString();        mshrMissRate[access_idx]            .name(name() + "." + cstr + "_mshr_miss_rate")            .desc("mshr miss rate for " + cstr + " accesses")            .flags(total | nozero | nonan)            ;        mshrMissRate[access_idx] =            mshr_misses[access_idx] / accesses[access_idx];    }    demandMshrMissRate        .name(name() + ".demand_mshr_miss_rate")        .desc("mshr miss rate for demand accesses")        .flags(total)        ;    demandMshrMissRate = demandMshrMisses / demandAccesses;    overallMshrMissRate        .name(name() + ".overall_mshr_miss_rate")        .desc("mshr miss rate for overall accesses")        .flags(total)        ;    overallMshrMissRate = overallMshrMisses / overallAccesses;    // mshrMiss latency formulas    for (int access_idx = 0; access_idx < MemCmd::NUM_MEM_CMDS; ++access_idx) {        MemCmd cmd(access_idx);        const string &cstr = cmd.toString();        avgMshrMissLatency[access_idx]            .name(name() + "." + cstr + "_avg_mshr_miss_latency")            .desc("average " + cstr + " mshr miss latency")            .flags(total | nozero | nonan)            ;        avgMshrMissLatency[access_idx] =            mshr_miss_latency[access_idx] / mshr_misses[access_idx];    }    demandAvgMshrMissLatency        .name(name() + ".demand_avg_mshr_miss_latency")        .desc("average overall mshr miss latency")        .flags(total)        ;    demandAvgMshrMissLatency = demandMshrMissLatency / demandMshrMisses;    overallAvgMshrMissLatency        .name(name() + ".overall_avg_mshr_miss_latency")        .desc("average overall mshr miss latency")        .flags(total)        ;    overallAvgMshrMissLatency = overallMshrMissLatency / overallMshrMisses;    // mshrUncacheable latency formulas    for (int access_idx = 0; access_idx < MemCmd::NUM_MEM_CMDS; ++access_idx) {        MemCmd cmd(access_idx);        const string &cstr = cmd.toString();        avgMshrUncacheableLatency[access_idx]            .name(name() + "." + cstr + "_avg_mshr_uncacheable_latency")            .desc("average " + cstr + " mshr uncacheable latency")            .flags(total | nozero | nonan)            ;        avgMshrUncacheableLatency[access_idx] =            mshr_uncacheable_lat[access_idx] / mshr_uncacheable[access_idx];    }    overallAvgMshrUncacheableLatency        .name(name() + ".overall_avg_mshr_uncacheable_latency")        .desc("average overall mshr uncacheable latency")        .flags(total)        ;    overallAvgMshrUncacheableLatency = overallMshrUncacheableLatency / overallMshrUncacheable;    mshr_cap_events        .init(maxThreadsPerCPU)        .name(name() + ".mshr_cap_events")        .desc("number of times MSHR cap was activated")        .flags(total)        ;    //software prefetching stats    soft_prefetch_mshr_full        .init(maxThreadsPerCPU)        .name(name() + ".soft_prefetch_mshr_full")        .desc("number of mshr full events for SW prefetching instrutions")        .flags(total)        ;    mshr_no_allocate_misses        .name(name() +".no_allocate_misses")        .desc("Number of misses that were no-allocate")        ;}unsigned intBaseCache::drain(Event *de){    int count = memSidePort->drain(de) + cpuSidePort->drain(de);    // Set status    if (count != 0) {        drainEvent = de;        changeState(SimObject::Draining);        return count;    }    changeState(SimObject::Drained);    return 0;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?