base.cc (8809:bb10807da889) | base.cc (8833:2870638642bd) |
---|---|
1/* 2 * Copyright (c) 2003-2005 The Regents of The University of Michigan 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer; --- 51 unchanged lines hidden (view full) --- 60 numTarget(p->tgts_per_mshr), 61 forwardSnoops(p->forward_snoops), 62 isTopLevel(p->is_top_level), 63 blocked(0), 64 noTargetMSHR(NULL), 65 missCount(p->max_miss_count), 66 drainEvent(NULL), 67 addrRange(p->addr_range), | 1/* 2 * Copyright (c) 2003-2005 The Regents of The University of Michigan 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer; --- 51 unchanged lines hidden (view full) --- 60 numTarget(p->tgts_per_mshr), 61 forwardSnoops(p->forward_snoops), 62 isTopLevel(p->is_top_level), 63 blocked(0), 64 noTargetMSHR(NULL), 65 missCount(p->max_miss_count), 66 drainEvent(NULL), 67 addrRange(p->addr_range), |
68 _numCpus(p->num_cpus) | 68 system(p->system) |
69{ 70} 71 72 73bool 74BaseCache::CachePort::checkFunctional(PacketPtr pkt) 75{ 76 pkt->pushLabel(label); --- 61 unchanged lines hidden (view full) --- 138 using namespace Stats; 139 140 // Hit statistics 141 for (int access_idx = 0; access_idx < MemCmd::NUM_MEM_CMDS; ++access_idx) { 142 MemCmd cmd(access_idx); 143 const string &cstr = cmd.toString(); 144 145 hits[access_idx] | 69{ 70} 71 72 73bool 74BaseCache::CachePort::checkFunctional(PacketPtr pkt) 75{ 76 pkt->pushLabel(label); --- 61 unchanged lines hidden (view full) --- 138 using namespace Stats; 139 140 // Hit statistics 141 for (int access_idx = 0; access_idx < MemCmd::NUM_MEM_CMDS; ++access_idx) { 142 MemCmd cmd(access_idx); 143 const string &cstr = cmd.toString(); 144 145 hits[access_idx] |
146 .init(FullSystem ? (_numCpus + 1) : _numCpus) | 146 .init(system->maxMasters()) |
147 .name(name() + "." + cstr + "_hits") 148 .desc("number of " + cstr + " hits") 149 .flags(total | nozero | nonan) 150 ; | 147 .name(name() + "." + cstr + "_hits") 148 .desc("number of " + cstr + " hits") 149 .flags(total | nozero | nonan) 150 ; |
151 for (int i = 0; i < system->maxMasters(); i++) { 152 hits[access_idx].subname(i, system->getMasterName(i)); 153 } |
|
151 } 152 153// These macros make it easier to sum the right subset of commands and 154// to change the subset of commands that are considered "demand" vs 155// "non-demand" 156#define SUM_DEMAND(s) \ 157 (s[MemCmd::ReadReq] + s[MemCmd::WriteReq] + s[MemCmd::ReadExReq]) 158 159// should writebacks be included here? prior code was inconsistent... 160#define SUM_NON_DEMAND(s) \ 161 (s[MemCmd::SoftPFReq] + s[MemCmd::HardPFReq]) 162 163 demandHits 164 .name(name() + ".demand_hits") 165 .desc("number of demand (read+write) hits") | 154 } 155 156// These macros make it easier to sum the right subset of commands and 157// to change the subset of commands that are considered "demand" vs 158// "non-demand" 159#define SUM_DEMAND(s) \ 160 (s[MemCmd::ReadReq] + s[MemCmd::WriteReq] + s[MemCmd::ReadExReq]) 161 162// should writebacks be included here? prior code was inconsistent... 163#define SUM_NON_DEMAND(s) \ 164 (s[MemCmd::SoftPFReq] + s[MemCmd::HardPFReq]) 165 166 demandHits 167 .name(name() + ".demand_hits") 168 .desc("number of demand (read+write) hits") |
166 .flags(total) | 169 .flags(total | nozero | nonan) |
167 ; 168 demandHits = SUM_DEMAND(hits); | 170 ; 171 demandHits = SUM_DEMAND(hits); |
172 for (int i = 0; i < system->maxMasters(); i++) { 173 demandHits.subname(i, system->getMasterName(i)); 174 } |
|
169 170 overallHits 171 .name(name() + ".overall_hits") 172 .desc("number of overall hits") | 175 176 overallHits 177 .name(name() + ".overall_hits") 178 .desc("number of overall hits") |
173 .flags(total) | 179 .flags(total | nozero | nonan) |
174 ; 175 overallHits = demandHits + SUM_NON_DEMAND(hits); | 180 ; 181 overallHits = demandHits + SUM_NON_DEMAND(hits); |
182 for (int i = 0; i < system->maxMasters(); i++) { 183 overallHits.subname(i, system->getMasterName(i)); 184 } |
|
176 177 // Miss statistics 178 for (int access_idx = 0; access_idx < MemCmd::NUM_MEM_CMDS; ++access_idx) { 179 MemCmd cmd(access_idx); 180 const string &cstr = cmd.toString(); 181 182 misses[access_idx] | 185 186 // Miss statistics 187 for (int access_idx = 0; access_idx < MemCmd::NUM_MEM_CMDS; ++access_idx) { 188 MemCmd cmd(access_idx); 189 const string &cstr = cmd.toString(); 190 191 misses[access_idx] |
183 .init(FullSystem ? (_numCpus + 1) : _numCpus) | 192 .init(system->maxMasters()) |
184 .name(name() + "." + cstr + "_misses") 185 .desc("number of " + cstr + " misses") 186 .flags(total | nozero | nonan) 187 ; | 193 .name(name() + "." + cstr + "_misses") 194 .desc("number of " + cstr + " misses") 195 .flags(total | nozero | nonan) 196 ; |
197 for (int i = 0; i < system->maxMasters(); i++) { 198 misses[access_idx].subname(i, system->getMasterName(i)); 199 } |
|
188 } 189 190 demandMisses 191 .name(name() + ".demand_misses") 192 .desc("number of demand (read+write) misses") | 200 } 201 202 demandMisses 203 .name(name() + ".demand_misses") 204 .desc("number of demand (read+write) misses") |
193 .flags(total) | 205 .flags(total | nozero | nonan) |
194 ; 195 demandMisses = SUM_DEMAND(misses); | 206 ; 207 demandMisses = SUM_DEMAND(misses); |
208 for (int i = 0; i < system->maxMasters(); i++) { 209 demandMisses.subname(i, system->getMasterName(i)); 210 } |
|
196 197 overallMisses 198 .name(name() + ".overall_misses") 199 .desc("number of overall misses") | 211 212 overallMisses 213 .name(name() + ".overall_misses") 214 .desc("number of overall misses") |
200 .flags(total) | 215 .flags(total | nozero | nonan) |
201 ; 202 overallMisses = demandMisses + SUM_NON_DEMAND(misses); | 216 ; 217 overallMisses = demandMisses + SUM_NON_DEMAND(misses); |
218 for (int i = 0; i < system->maxMasters(); i++) { 219 overallMisses.subname(i, system->getMasterName(i)); 220 } |
|
203 204 // Miss latency statistics 205 for (int access_idx = 0; access_idx < MemCmd::NUM_MEM_CMDS; ++access_idx) { 206 MemCmd cmd(access_idx); 207 const string &cstr = cmd.toString(); 208 209 missLatency[access_idx] | 221 222 // Miss latency statistics 223 for (int access_idx = 0; access_idx < MemCmd::NUM_MEM_CMDS; ++access_idx) { 224 MemCmd cmd(access_idx); 225 const string &cstr = cmd.toString(); 226 227 missLatency[access_idx] |
210 .init(maxThreadsPerCPU) | 228 .init(system->maxMasters()) |
211 .name(name() + "." + cstr + "_miss_latency") 212 .desc("number of " + cstr + " miss cycles") 213 .flags(total | nozero | nonan) 214 ; | 229 .name(name() + "." + cstr + "_miss_latency") 230 .desc("number of " + cstr + " miss cycles") 231 .flags(total | nozero | nonan) 232 ; |
233 for (int i = 0; i < system->maxMasters(); i++) { 234 missLatency[access_idx].subname(i, system->getMasterName(i)); 235 } |
|
215 } 216 217 demandMissLatency 218 .name(name() + ".demand_miss_latency") 219 .desc("number of demand (read+write) miss cycles") | 236 } 237 238 demandMissLatency 239 .name(name() + ".demand_miss_latency") 240 .desc("number of demand (read+write) miss cycles") |
220 .flags(total) | 241 .flags(total | nozero | nonan) |
221 ; 222 demandMissLatency = SUM_DEMAND(missLatency); | 242 ; 243 demandMissLatency = SUM_DEMAND(missLatency); |
244 for (int i = 0; i < system->maxMasters(); i++) { 245 demandMissLatency.subname(i, system->getMasterName(i)); 246 } |
|
223 224 overallMissLatency 225 .name(name() + ".overall_miss_latency") 226 .desc("number of overall miss cycles") | 247 248 overallMissLatency 249 .name(name() + ".overall_miss_latency") 250 .desc("number of overall miss cycles") |
227 .flags(total) | 251 .flags(total | nozero | nonan) |
228 ; 229 overallMissLatency = demandMissLatency + SUM_NON_DEMAND(missLatency); | 252 ; 253 overallMissLatency = demandMissLatency + SUM_NON_DEMAND(missLatency); |
254 for (int i = 0; i < system->maxMasters(); i++) { 255 overallMissLatency.subname(i, system->getMasterName(i)); 256 } |
|
230 231 // access formulas 232 for (int access_idx = 0; access_idx < MemCmd::NUM_MEM_CMDS; ++access_idx) { 233 MemCmd cmd(access_idx); 234 const string &cstr = cmd.toString(); 235 236 accesses[access_idx] 237 .name(name() + "." + cstr + "_accesses") 238 .desc("number of " + cstr + " accesses(hits+misses)") 239 .flags(total | nozero | nonan) 240 ; | 257 258 // access formulas 259 for (int access_idx = 0; access_idx < MemCmd::NUM_MEM_CMDS; ++access_idx) { 260 MemCmd cmd(access_idx); 261 const string &cstr = cmd.toString(); 262 263 accesses[access_idx] 264 .name(name() + "." + cstr + "_accesses") 265 .desc("number of " + cstr + " accesses(hits+misses)") 266 .flags(total | nozero | nonan) 267 ; |
241 | |
242 accesses[access_idx] = hits[access_idx] + misses[access_idx]; | 268 accesses[access_idx] = hits[access_idx] + misses[access_idx]; |
269 270 for (int i = 0; i < system->maxMasters(); i++) { 271 accesses[access_idx].subname(i, system->getMasterName(i)); 272 } |
|
243 } 244 245 demandAccesses 246 .name(name() + ".demand_accesses") 247 .desc("number of demand (read+write) accesses") | 273 } 274 275 demandAccesses 276 .name(name() + ".demand_accesses") 277 .desc("number of demand (read+write) accesses") |
248 .flags(total) | 278 .flags(total | nozero | nonan) |
249 ; 250 demandAccesses = demandHits + demandMisses; | 279 ; 280 demandAccesses = demandHits + demandMisses; |
281 for (int i = 0; i < system->maxMasters(); i++) { 282 demandAccesses.subname(i, system->getMasterName(i)); 283 } |
|
251 252 overallAccesses 253 .name(name() + ".overall_accesses") 254 .desc("number of overall (read+write) accesses") | 284 285 overallAccesses 286 .name(name() + ".overall_accesses") 287 .desc("number of overall (read+write) accesses") |
255 .flags(total) | 288 .flags(total | nozero | nonan) |
256 ; 257 overallAccesses = overallHits + overallMisses; | 289 ; 290 overallAccesses = overallHits + overallMisses; |
291 for (int i = 0; i < system->maxMasters(); i++) { 292 overallAccesses.subname(i, system->getMasterName(i)); 293 } |
|
258 259 // miss rate formulas 260 for (int access_idx = 0; access_idx < MemCmd::NUM_MEM_CMDS; ++access_idx) { 261 MemCmd cmd(access_idx); 262 const string &cstr = cmd.toString(); 263 264 missRate[access_idx] 265 .name(name() + "." + cstr + "_miss_rate") 266 .desc("miss rate for " + cstr + " accesses") 267 .flags(total | nozero | nonan) 268 ; | 294 295 // miss rate formulas 296 for (int access_idx = 0; access_idx < MemCmd::NUM_MEM_CMDS; ++access_idx) { 297 MemCmd cmd(access_idx); 298 const string &cstr = cmd.toString(); 299 300 missRate[access_idx] 301 .name(name() + "." + cstr + "_miss_rate") 302 .desc("miss rate for " + cstr + " accesses") 303 .flags(total | nozero | nonan) 304 ; |
269 | |
270 missRate[access_idx] = misses[access_idx] / accesses[access_idx]; | 305 missRate[access_idx] = misses[access_idx] / accesses[access_idx]; |
306 307 for (int i = 0; i < system->maxMasters(); i++) { 308 missRate[access_idx].subname(i, system->getMasterName(i)); 309 } |
|
271 } 272 273 demandMissRate 274 .name(name() + ".demand_miss_rate") 275 .desc("miss rate for demand accesses") | 310 } 311 312 demandMissRate 313 .name(name() + ".demand_miss_rate") 314 .desc("miss rate for demand accesses") |
276 .flags(total) | 315 .flags(total | nozero | nonan) |
277 ; 278 demandMissRate = demandMisses / demandAccesses; | 316 ; 317 demandMissRate = demandMisses / demandAccesses; |
318 for (int i = 0; i < system->maxMasters(); i++) { 319 demandMissRate.subname(i, system->getMasterName(i)); 320 } |
|
279 280 overallMissRate 281 .name(name() + ".overall_miss_rate") 282 .desc("miss rate for overall accesses") | 321 322 overallMissRate 323 .name(name() + ".overall_miss_rate") 324 .desc("miss rate for overall accesses") |
283 .flags(total) | 325 .flags(total | nozero | nonan) |
284 ; 285 overallMissRate = overallMisses / overallAccesses; | 326 ; 327 overallMissRate = overallMisses / overallAccesses; |
328 for (int i = 0; i < system->maxMasters(); i++) { 329 overallMissRate.subname(i, system->getMasterName(i)); 330 } |
|
286 287 // miss latency formulas 288 for (int access_idx = 0; access_idx < MemCmd::NUM_MEM_CMDS; ++access_idx) { 289 MemCmd cmd(access_idx); 290 const string &cstr = cmd.toString(); 291 292 avgMissLatency[access_idx] 293 .name(name() + "." + cstr + "_avg_miss_latency") 294 .desc("average " + cstr + " miss latency") 295 .flags(total | nozero | nonan) 296 ; | 331 332 // miss latency formulas 333 for (int access_idx = 0; access_idx < MemCmd::NUM_MEM_CMDS; ++access_idx) { 334 MemCmd cmd(access_idx); 335 const string &cstr = cmd.toString(); 336 337 avgMissLatency[access_idx] 338 .name(name() + "." + cstr + "_avg_miss_latency") 339 .desc("average " + cstr + " miss latency") 340 .flags(total | nozero | nonan) 341 ; |
297 | |
298 avgMissLatency[access_idx] = 299 missLatency[access_idx] / misses[access_idx]; | 342 avgMissLatency[access_idx] = 343 missLatency[access_idx] / misses[access_idx]; |
344 345 for (int i = 0; i < system->maxMasters(); i++) { 346 avgMissLatency[access_idx].subname(i, system->getMasterName(i)); 347 } |
|
300 } 301 302 demandAvgMissLatency 303 .name(name() + ".demand_avg_miss_latency") 304 .desc("average overall miss latency") | 348 } 349 350 demandAvgMissLatency 351 .name(name() + ".demand_avg_miss_latency") 352 .desc("average overall miss latency") |
305 .flags(total) | 353 .flags(total | nozero | nonan) |
306 ; 307 demandAvgMissLatency = demandMissLatency / demandMisses; | 354 ; 355 demandAvgMissLatency = demandMissLatency / demandMisses; |
356 for (int i = 0; i < system->maxMasters(); i++) { 357 demandAvgMissLatency.subname(i, system->getMasterName(i)); 358 } |
|
308 309 overallAvgMissLatency 310 .name(name() + ".overall_avg_miss_latency") 311 .desc("average overall miss latency") | 359 360 overallAvgMissLatency 361 .name(name() + ".overall_avg_miss_latency") 362 .desc("average overall miss latency") |
312 .flags(total) | 363 .flags(total | nozero | nonan) |
313 ; 314 overallAvgMissLatency = overallMissLatency / overallMisses; | 364 ; 365 overallAvgMissLatency = overallMissLatency / overallMisses; |
366 for (int i = 0; i < system->maxMasters(); i++) { 367 overallAvgMissLatency.subname(i, system->getMasterName(i)); 368 } |
|
315 316 blocked_cycles.init(NUM_BLOCKED_CAUSES); 317 blocked_cycles 318 .name(name() + ".blocked_cycles") 319 .desc("number of cycles access was blocked") 320 .subname(Blocked_NoMSHRs, "no_mshrs") 321 .subname(Blocked_NoTargets, "no_targets") 322 ; --- 22 unchanged lines hidden (view full) --- 345 ; 346 347 cacheCopies 348 .name(name() + ".cache_copies") 349 .desc("number of cache copies performed") 350 ; 351 352 writebacks | 369 370 blocked_cycles.init(NUM_BLOCKED_CAUSES); 371 blocked_cycles 372 .name(name() + ".blocked_cycles") 373 .desc("number of cycles access was blocked") 374 .subname(Blocked_NoMSHRs, "no_mshrs") 375 .subname(Blocked_NoTargets, "no_targets") 376 ; --- 22 unchanged lines hidden (view full) --- 399 ; 400 401 cacheCopies 402 .name(name() + ".cache_copies") 403 .desc("number of cache copies performed") 404 ; 405 406 writebacks |
353 .init(maxThreadsPerCPU) | 407 .init(system->maxMasters()) |
354 .name(name() + ".writebacks") 355 .desc("number of writebacks") | 408 .name(name() + ".writebacks") 409 .desc("number of writebacks") |
356 .flags(total) | 410 .flags(total | nozero | nonan) |
357 ; | 411 ; |
412 for (int i = 0; i < system->maxMasters(); i++) { 413 writebacks.subname(i, system->getMasterName(i)); 414 } |
|
358 359 // MSHR statistics 360 // MSHR hit statistics 361 for (int access_idx = 0; access_idx < MemCmd::NUM_MEM_CMDS; ++access_idx) { 362 MemCmd cmd(access_idx); 363 const string &cstr = cmd.toString(); 364 365 mshr_hits[access_idx] | 415 416 // MSHR statistics 417 // MSHR hit statistics 418 for (int access_idx = 0; access_idx < MemCmd::NUM_MEM_CMDS; ++access_idx) { 419 MemCmd cmd(access_idx); 420 const string &cstr = cmd.toString(); 421 422 mshr_hits[access_idx] |
366 .init(maxThreadsPerCPU) | 423 .init(system->maxMasters()) |
367 .name(name() + "." + cstr + "_mshr_hits") 368 .desc("number of " + cstr + " MSHR hits") 369 .flags(total | nozero | nonan) 370 ; | 424 .name(name() + "." + cstr + "_mshr_hits") 425 .desc("number of " + cstr + " MSHR hits") 426 .flags(total | nozero | nonan) 427 ; |
428 for (int i = 0; i < system->maxMasters(); i++) { 429 mshr_hits[access_idx].subname(i, system->getMasterName(i)); 430 } |
|
371 } 372 373 demandMshrHits 374 .name(name() + ".demand_mshr_hits") 375 .desc("number of demand (read+write) MSHR hits") | 431 } 432 433 demandMshrHits 434 .name(name() + ".demand_mshr_hits") 435 .desc("number of demand (read+write) MSHR hits") |
376 .flags(total) | 436 .flags(total | nozero | nonan) |
377 ; 378 demandMshrHits = SUM_DEMAND(mshr_hits); | 437 ; 438 demandMshrHits = SUM_DEMAND(mshr_hits); |
439 for (int i = 0; i < system->maxMasters(); i++) { 440 demandMshrHits.subname(i, system->getMasterName(i)); 441 } |
|
379 380 overallMshrHits 381 .name(name() + ".overall_mshr_hits") 382 .desc("number of overall MSHR hits") | 442 443 overallMshrHits 444 .name(name() + ".overall_mshr_hits") 445 .desc("number of overall MSHR hits") |
383 .flags(total) | 446 .flags(total | nozero | nonan) |
384 ; 385 overallMshrHits = demandMshrHits + SUM_NON_DEMAND(mshr_hits); | 447 ; 448 overallMshrHits = demandMshrHits + SUM_NON_DEMAND(mshr_hits); |
449 for (int i = 0; i < system->maxMasters(); i++) { 450 overallMshrHits.subname(i, system->getMasterName(i)); 451 } |
|
386 387 // MSHR miss statistics 388 for (int access_idx = 0; access_idx < MemCmd::NUM_MEM_CMDS; ++access_idx) { 389 MemCmd cmd(access_idx); 390 const string &cstr = cmd.toString(); 391 392 mshr_misses[access_idx] | 452 453 // MSHR miss statistics 454 for (int access_idx = 0; access_idx < MemCmd::NUM_MEM_CMDS; ++access_idx) { 455 MemCmd cmd(access_idx); 456 const string &cstr = cmd.toString(); 457 458 mshr_misses[access_idx] |
393 .init(maxThreadsPerCPU) | 459 .init(system->maxMasters()) |
394 .name(name() + "." + cstr + "_mshr_misses") 395 .desc("number of " + cstr + " MSHR misses") 396 .flags(total | nozero | nonan) 397 ; | 460 .name(name() + "." + cstr + "_mshr_misses") 461 .desc("number of " + cstr + " MSHR misses") 462 .flags(total | nozero | nonan) 463 ; |
464 for (int i = 0; i < system->maxMasters(); i++) { 465 mshr_misses[access_idx].subname(i, system->getMasterName(i)); 466 } |
|
398 } 399 400 demandMshrMisses 401 .name(name() + ".demand_mshr_misses") 402 .desc("number of demand (read+write) MSHR misses") | 467 } 468 469 demandMshrMisses 470 .name(name() + ".demand_mshr_misses") 471 .desc("number of demand (read+write) MSHR misses") |
403 .flags(total) | 472 .flags(total | nozero | nonan) |
404 ; 405 demandMshrMisses = SUM_DEMAND(mshr_misses); | 473 ; 474 demandMshrMisses = SUM_DEMAND(mshr_misses); |
475 for (int i = 0; i < system->maxMasters(); i++) { 476 demandMshrMisses.subname(i, system->getMasterName(i)); 477 } |
|
406 407 overallMshrMisses 408 .name(name() + ".overall_mshr_misses") 409 .desc("number of overall MSHR misses") | 478 479 overallMshrMisses 480 .name(name() + ".overall_mshr_misses") 481 .desc("number of overall MSHR misses") |
410 .flags(total) | 482 .flags(total | nozero | nonan) |
411 ; 412 overallMshrMisses = demandMshrMisses + SUM_NON_DEMAND(mshr_misses); | 483 ; 484 overallMshrMisses = demandMshrMisses + SUM_NON_DEMAND(mshr_misses); |
485 for (int i = 0; i < system->maxMasters(); i++) { 486 overallMshrMisses.subname(i, system->getMasterName(i)); 487 } |
|
413 414 // MSHR miss latency statistics 415 for (int access_idx = 0; access_idx < MemCmd::NUM_MEM_CMDS; ++access_idx) { 416 MemCmd cmd(access_idx); 417 const string &cstr = cmd.toString(); 418 419 mshr_miss_latency[access_idx] | 488 489 // MSHR miss latency statistics 490 for (int access_idx = 0; access_idx < MemCmd::NUM_MEM_CMDS; ++access_idx) { 491 MemCmd cmd(access_idx); 492 const string &cstr = cmd.toString(); 493 494 mshr_miss_latency[access_idx] |
420 .init(maxThreadsPerCPU) | 495 .init(system->maxMasters()) |
421 .name(name() + "." + cstr + "_mshr_miss_latency") 422 .desc("number of " + cstr + " MSHR miss cycles") 423 .flags(total | nozero | nonan) 424 ; | 496 .name(name() + "." + cstr + "_mshr_miss_latency") 497 .desc("number of " + cstr + " MSHR miss cycles") 498 .flags(total | nozero | nonan) 499 ; |
500 for (int i = 0; i < system->maxMasters(); i++) { 501 mshr_miss_latency[access_idx].subname(i, system->getMasterName(i)); 502 } |
|
425 } 426 427 demandMshrMissLatency 428 .name(name() + ".demand_mshr_miss_latency") 429 .desc("number of demand (read+write) MSHR miss cycles") | 503 } 504 505 demandMshrMissLatency 506 .name(name() + ".demand_mshr_miss_latency") 507 .desc("number of demand (read+write) MSHR miss cycles") |
430 .flags(total) | 508 .flags(total | nozero | nonan) |
431 ; 432 demandMshrMissLatency = SUM_DEMAND(mshr_miss_latency); | 509 ; 510 demandMshrMissLatency = SUM_DEMAND(mshr_miss_latency); |
511 for (int i = 0; i < system->maxMasters(); i++) { 512 demandMshrMissLatency.subname(i, system->getMasterName(i)); 513 } |
|
433 434 overallMshrMissLatency 435 .name(name() + ".overall_mshr_miss_latency") 436 .desc("number of overall MSHR miss cycles") | 514 515 overallMshrMissLatency 516 .name(name() + ".overall_mshr_miss_latency") 517 .desc("number of overall MSHR miss cycles") |
437 .flags(total) | 518 .flags(total | nozero | nonan) |
438 ; 439 overallMshrMissLatency = 440 demandMshrMissLatency + SUM_NON_DEMAND(mshr_miss_latency); | 519 ; 520 overallMshrMissLatency = 521 demandMshrMissLatency + SUM_NON_DEMAND(mshr_miss_latency); |
522 for (int i = 0; i < system->maxMasters(); i++) { 523 overallMshrMissLatency.subname(i, system->getMasterName(i)); 524 } |
|
441 442 // MSHR uncacheable statistics 443 for (int access_idx = 0; access_idx < MemCmd::NUM_MEM_CMDS; ++access_idx) { 444 MemCmd cmd(access_idx); 445 const string &cstr = cmd.toString(); 446 447 mshr_uncacheable[access_idx] | 525 526 // MSHR uncacheable statistics 527 for (int access_idx = 0; access_idx < MemCmd::NUM_MEM_CMDS; ++access_idx) { 528 MemCmd cmd(access_idx); 529 const string &cstr = cmd.toString(); 530 531 mshr_uncacheable[access_idx] |
448 .init(maxThreadsPerCPU) | 532 .init(system->maxMasters()) |
449 .name(name() + "." + cstr + "_mshr_uncacheable") 450 .desc("number of " + cstr + " MSHR uncacheable") 451 .flags(total | nozero | nonan) 452 ; | 533 .name(name() + "." + cstr + "_mshr_uncacheable") 534 .desc("number of " + cstr + " MSHR uncacheable") 535 .flags(total | nozero | nonan) 536 ; |
537 for (int i = 0; i < system->maxMasters(); i++) { 538 mshr_uncacheable[access_idx].subname(i, system->getMasterName(i)); 539 } |
|
453 } 454 455 overallMshrUncacheable 456 .name(name() + ".overall_mshr_uncacheable_misses") 457 .desc("number of overall MSHR uncacheable misses") | 540 } 541 542 overallMshrUncacheable 543 .name(name() + ".overall_mshr_uncacheable_misses") 544 .desc("number of overall MSHR uncacheable misses") |
458 .flags(total) | 545 .flags(total | nozero | nonan) |
459 ; 460 overallMshrUncacheable = 461 SUM_DEMAND(mshr_uncacheable) + SUM_NON_DEMAND(mshr_uncacheable); | 546 ; 547 overallMshrUncacheable = 548 SUM_DEMAND(mshr_uncacheable) + SUM_NON_DEMAND(mshr_uncacheable); |
549 for (int i = 0; i < system->maxMasters(); i++) { 550 overallMshrUncacheable.subname(i, system->getMasterName(i)); 551 } |
|
462 463 // MSHR miss latency statistics 464 for (int access_idx = 0; access_idx < MemCmd::NUM_MEM_CMDS; ++access_idx) { 465 MemCmd cmd(access_idx); 466 const string &cstr = cmd.toString(); 467 468 mshr_uncacheable_lat[access_idx] | 552 553 // MSHR miss latency statistics 554 for (int access_idx = 0; access_idx < MemCmd::NUM_MEM_CMDS; ++access_idx) { 555 MemCmd cmd(access_idx); 556 const string &cstr = cmd.toString(); 557 558 mshr_uncacheable_lat[access_idx] |
469 .init(maxThreadsPerCPU) | 559 .init(system->maxMasters()) |
470 .name(name() + "." + cstr + "_mshr_uncacheable_latency") 471 .desc("number of " + cstr + " MSHR uncacheable cycles") 472 .flags(total | nozero | nonan) 473 ; | 560 .name(name() + "." + cstr + "_mshr_uncacheable_latency") 561 .desc("number of " + cstr + " MSHR uncacheable cycles") 562 .flags(total | nozero | nonan) 563 ; |
564 for (int i = 0; i < system->maxMasters(); i++) { 565 mshr_uncacheable_lat[access_idx].subname(i, system->getMasterName(i)); 566 } |
|
474 } 475 476 overallMshrUncacheableLatency 477 .name(name() + ".overall_mshr_uncacheable_latency") 478 .desc("number of overall MSHR uncacheable cycles") | 567 } 568 569 overallMshrUncacheableLatency 570 .name(name() + ".overall_mshr_uncacheable_latency") 571 .desc("number of overall MSHR uncacheable cycles") |
479 .flags(total) | 572 .flags(total | nozero | nonan) |
480 ; 481 overallMshrUncacheableLatency = 482 SUM_DEMAND(mshr_uncacheable_lat) + 483 SUM_NON_DEMAND(mshr_uncacheable_lat); | 573 ; 574 overallMshrUncacheableLatency = 575 SUM_DEMAND(mshr_uncacheable_lat) + 576 SUM_NON_DEMAND(mshr_uncacheable_lat); |
577 for (int i = 0; i < system->maxMasters(); i++) { 578 overallMshrUncacheableLatency.subname(i, system->getMasterName(i)); 579 } |
|
484 485#if 0 486 // MSHR access formulas 487 for (int access_idx = 0; access_idx < MemCmd::NUM_MEM_CMDS; ++access_idx) { 488 MemCmd cmd(access_idx); 489 const string &cstr = cmd.toString(); 490 491 mshrAccesses[access_idx] --- 27 unchanged lines hidden (view full) --- 519 MemCmd cmd(access_idx); 520 const string &cstr = cmd.toString(); 521 522 mshrMissRate[access_idx] 523 .name(name() + "." + cstr + "_mshr_miss_rate") 524 .desc("mshr miss rate for " + cstr + " accesses") 525 .flags(total | nozero | nonan) 526 ; | 580 581#if 0 582 // MSHR access formulas 583 for (int access_idx = 0; access_idx < MemCmd::NUM_MEM_CMDS; ++access_idx) { 584 MemCmd cmd(access_idx); 585 const string &cstr = cmd.toString(); 586 587 mshrAccesses[access_idx] --- 27 unchanged lines hidden (view full) --- 615 MemCmd cmd(access_idx); 616 const string &cstr = cmd.toString(); 617 618 mshrMissRate[access_idx] 619 .name(name() + "." + cstr + "_mshr_miss_rate") 620 .desc("mshr miss rate for " + cstr + " accesses") 621 .flags(total | nozero | nonan) 622 ; |
527 | |
528 mshrMissRate[access_idx] = 529 mshr_misses[access_idx] / accesses[access_idx]; | 623 mshrMissRate[access_idx] = 624 mshr_misses[access_idx] / accesses[access_idx]; |
625 626 for (int i = 0; i < system->maxMasters(); i++) { 627 mshrMissRate[access_idx].subname(i, system->getMasterName(i)); 628 } |
|
530 } 531 532 demandMshrMissRate 533 .name(name() + ".demand_mshr_miss_rate") 534 .desc("mshr miss rate for demand accesses") | 629 } 630 631 demandMshrMissRate 632 .name(name() + ".demand_mshr_miss_rate") 633 .desc("mshr miss rate for demand accesses") |
535 .flags(total) | 634 .flags(total | nozero | nonan) |
536 ; 537 demandMshrMissRate = demandMshrMisses / demandAccesses; | 635 ; 636 demandMshrMissRate = demandMshrMisses / demandAccesses; |
637 for (int i = 0; i < system->maxMasters(); i++) { 638 demandMshrMissRate.subname(i, system->getMasterName(i)); 639 } |
|
538 539 overallMshrMissRate 540 .name(name() + ".overall_mshr_miss_rate") 541 .desc("mshr miss rate for overall accesses") | 640 641 overallMshrMissRate 642 .name(name() + ".overall_mshr_miss_rate") 643 .desc("mshr miss rate for overall accesses") |
542 .flags(total) | 644 .flags(total | nozero | nonan) |
543 ; 544 overallMshrMissRate = overallMshrMisses / overallAccesses; | 645 ; 646 overallMshrMissRate = overallMshrMisses / overallAccesses; |
647 for (int i = 0; i < system->maxMasters(); i++) { 648 overallMshrMissRate.subname(i, system->getMasterName(i)); 649 } |
|
545 546 // mshrMiss latency formulas 547 for (int access_idx = 0; access_idx < MemCmd::NUM_MEM_CMDS; ++access_idx) { 548 MemCmd cmd(access_idx); 549 const string &cstr = cmd.toString(); 550 551 avgMshrMissLatency[access_idx] 552 .name(name() + "." + cstr + "_avg_mshr_miss_latency") 553 .desc("average " + cstr + " mshr miss latency") 554 .flags(total | nozero | nonan) 555 ; | 650 651 // mshrMiss latency formulas 652 for (int access_idx = 0; access_idx < MemCmd::NUM_MEM_CMDS; ++access_idx) { 653 MemCmd cmd(access_idx); 654 const string &cstr = cmd.toString(); 655 656 avgMshrMissLatency[access_idx] 657 .name(name() + "." + cstr + "_avg_mshr_miss_latency") 658 .desc("average " + cstr + " mshr miss latency") 659 .flags(total | nozero | nonan) 660 ; |
556 | |
557 avgMshrMissLatency[access_idx] = 558 mshr_miss_latency[access_idx] / mshr_misses[access_idx]; | 661 avgMshrMissLatency[access_idx] = 662 mshr_miss_latency[access_idx] / mshr_misses[access_idx]; |
663 664 for (int i = 0; i < system->maxMasters(); i++) { 665 avgMshrMissLatency[access_idx].subname(i, system->getMasterName(i)); 666 } |
|
559 } 560 561 demandAvgMshrMissLatency 562 .name(name() + ".demand_avg_mshr_miss_latency") 563 .desc("average overall mshr miss latency") | 667 } 668 669 demandAvgMshrMissLatency 670 .name(name() + ".demand_avg_mshr_miss_latency") 671 .desc("average overall mshr miss latency") |
564 .flags(total) | 672 .flags(total | nozero | nonan) |
565 ; 566 demandAvgMshrMissLatency = demandMshrMissLatency / demandMshrMisses; | 673 ; 674 demandAvgMshrMissLatency = demandMshrMissLatency / demandMshrMisses; |
675 for (int i = 0; i < system->maxMasters(); i++) { 676 demandAvgMshrMissLatency.subname(i, system->getMasterName(i)); 677 } |
|
567 568 overallAvgMshrMissLatency 569 .name(name() + ".overall_avg_mshr_miss_latency") 570 .desc("average overall mshr miss latency") | 678 679 overallAvgMshrMissLatency 680 .name(name() + ".overall_avg_mshr_miss_latency") 681 .desc("average overall mshr miss latency") |
571 .flags(total) | 682 .flags(total | nozero | nonan) |
572 ; 573 overallAvgMshrMissLatency = overallMshrMissLatency / overallMshrMisses; | 683 ; 684 overallAvgMshrMissLatency = overallMshrMissLatency / overallMshrMisses; |
685 for (int i = 0; i < system->maxMasters(); i++) { 686 overallAvgMshrMissLatency.subname(i, system->getMasterName(i)); 687 } |
|
574 575 // mshrUncacheable latency formulas 576 for (int access_idx = 0; access_idx < MemCmd::NUM_MEM_CMDS; ++access_idx) { 577 MemCmd cmd(access_idx); 578 const string &cstr = cmd.toString(); 579 580 avgMshrUncacheableLatency[access_idx] 581 .name(name() + "." + cstr + "_avg_mshr_uncacheable_latency") 582 .desc("average " + cstr + " mshr uncacheable latency") 583 .flags(total | nozero | nonan) 584 ; | 688 689 // mshrUncacheable latency formulas 690 for (int access_idx = 0; access_idx < MemCmd::NUM_MEM_CMDS; ++access_idx) { 691 MemCmd cmd(access_idx); 692 const string &cstr = cmd.toString(); 693 694 avgMshrUncacheableLatency[access_idx] 695 .name(name() + "." + cstr + "_avg_mshr_uncacheable_latency") 696 .desc("average " + cstr + " mshr uncacheable latency") 697 .flags(total | nozero | nonan) 698 ; |
585 | |
586 avgMshrUncacheableLatency[access_idx] = 587 mshr_uncacheable_lat[access_idx] / mshr_uncacheable[access_idx]; | 699 avgMshrUncacheableLatency[access_idx] = 700 mshr_uncacheable_lat[access_idx] / mshr_uncacheable[access_idx]; |
701 702 for (int i = 0; i < system->maxMasters(); i++) { 703 avgMshrUncacheableLatency[access_idx].subname(i, system->getMasterName(i)); 704 } |
|
588 } 589 590 overallAvgMshrUncacheableLatency 591 .name(name() + ".overall_avg_mshr_uncacheable_latency") 592 .desc("average overall mshr uncacheable latency") | 705 } 706 707 overallAvgMshrUncacheableLatency 708 .name(name() + ".overall_avg_mshr_uncacheable_latency") 709 .desc("average overall mshr uncacheable latency") |
593 .flags(total) | 710 .flags(total | nozero | nonan) |
594 ; 595 overallAvgMshrUncacheableLatency = overallMshrUncacheableLatency / overallMshrUncacheable; | 711 ; 712 overallAvgMshrUncacheableLatency = overallMshrUncacheableLatency / overallMshrUncacheable; |
713 for (int i = 0; i < system->maxMasters(); i++) { 714 overallAvgMshrUncacheableLatency.subname(i, system->getMasterName(i)); 715 } |
|
596 597 mshr_cap_events | 716 717 mshr_cap_events |
598 .init(maxThreadsPerCPU) | 718 .init(system->maxMasters()) |
599 .name(name() + ".mshr_cap_events") 600 .desc("number of times MSHR cap was activated") | 719 .name(name() + ".mshr_cap_events") 720 .desc("number of times MSHR cap was activated") |
601 .flags(total) | 721 .flags(total | nozero | nonan) |
602 ; | 722 ; |
723 for (int i = 0; i < system->maxMasters(); i++) { 724 mshr_cap_events.subname(i, system->getMasterName(i)); 725 } |
|
603 604 //software prefetching stats 605 soft_prefetch_mshr_full | 726 727 //software prefetching stats 728 soft_prefetch_mshr_full |
606 .init(maxThreadsPerCPU) | 729 .init(system->maxMasters()) |
607 .name(name() + ".soft_prefetch_mshr_full") 608 .desc("number of mshr full events for SW prefetching instrutions") | 730 .name(name() + ".soft_prefetch_mshr_full") 731 .desc("number of mshr full events for SW prefetching instrutions") |
609 .flags(total) | 732 .flags(total | nozero | nonan) |
610 ; | 733 ; |
734 for (int i = 0; i < system->maxMasters(); i++) { 735 soft_prefetch_mshr_full.subname(i, system->getMasterName(i)); 736 } |
|
611 612 mshr_no_allocate_misses 613 .name(name() +".no_allocate_misses") 614 .desc("Number of misses that were no-allocate") 615 ; 616 617} 618 --- 16 unchanged lines hidden --- | 737 738 mshr_no_allocate_misses 739 .name(name() +".no_allocate_misses") 740 .desc("Number of misses that were no-allocate") 741 ; 742 743} 744 --- 16 unchanged lines hidden --- |