void print_cache_statistics(FILE *fp, struct cache *c) { fprintf(fp, "\n"); fprintf(fp, "L%d Cache\n", c->cache_level); fprintf(fp, "Accesses: %d\n", total_accesses(c)); fprintf(fp, "Reads: %d\n", c->access_count[READ_ACCESS]); fprintf(fp, "Read Misses: %d\n", c->miss_count[READ_ACCESS]); fprintf(fp, "Writes: %d\n", c->access_count[WRITE_ACCESS]); fprintf(fp, "Write Misses: %d\n", c->miss_count[WRITE_ACCESS]); fprintf(fp, "Writebacks (Bytes): %zd\n", writebacks(c)); fprintf(fp, "Data Transferred (Bytes): %zd\n", total_data_transfered(c)); fprintf(fp, "Total Misses: %d\n", total_misses(c)); fprintf(fp, "Miss Rate: %0.6g\n", miss_rate(c)); fprintf(fp, "Total Storage (Bits): %lu\n", cache_area(c)); }
unsigned int average_access_time(struct cache *cache) { return hit_time(cache) + miss_rate(cache) * miss_penalty(cache); }
void Logger::print() { ofstream savefile; savefile.open("hybridsim.log", ios_base::out | ios_base::trunc); if (!savefile.is_open()) { cerr << "ERROR: HybridSim Logger output file failed to open.\n"; abort(); } savefile << "total accesses: " << num_accesses << "\n"; savefile << "cycles: " << this->currentClockCycle << "\n"; savefile << "execution time: " << (this->currentClockCycle / (double)CYCLES_PER_SECOND) * 1000000 << " us\n"; savefile << "frequency: " << CYCLES_PER_SECOND << "\n"; savefile << "misses: " << num_misses << "\n"; savefile << "hits: " << num_hits << "\n"; savefile << "miss rate: " << miss_rate() << "\n"; savefile << "average latency: " << this->latency_cycles(sum_latency, num_accesses) << " cycles"; savefile << " (" << this->latency_us(sum_latency, num_accesses) << " us)\n"; savefile << "average queue latency: " << this->latency_cycles(sum_queue_latency, num_accesses) << " cycles"; savefile << " (" << this->latency_us(sum_queue_latency, num_accesses) << " us)\n"; savefile << "average miss latency: " << this->latency_cycles(sum_miss_latency, num_misses) << " cycles"; savefile << " (" << this->latency_us(sum_miss_latency, num_misses) << " us)\n"; savefile << "average hit latency: " << this->latency_cycles(sum_hit_latency, num_hits) << " cycles"; savefile << " (" << this->latency_us(sum_hit_latency, num_hits) << " us)\n"; savefile << "throughput: " << this->compute_throughput(this->currentClockCycle, num_accesses) << " KB/s\n"; savefile << "working set size in pages: " << pages_used.size() << "\n"; savefile << "working set size in bytes: " << pages_used.size() * PAGE_SIZE << " bytes\n"; savefile << "page size: " << PAGE_SIZE << "\n"; savefile << "max queue length: " << max_queue_length << "\n"; savefile << "average queue length: " << this->divide(sum_queue_length, this->currentClockCycle) << "\n"; savefile << "idle counter: " << idle_counter << "\n"; savefile << "idle percentage: " << this->divide(idle_counter, currentClockCycle) << "\n"; savefile << "flash idle counter: " << flash_idle_counter << "\n"; savefile << "flash idle percentage: " << this->divide(flash_idle_counter, currentClockCycle) << "\n"; savefile << "dram idle counter: " << dram_idle_counter << "\n"; savefile << "dram idle percentage: " << this->divide(dram_idle_counter, currentClockCycle) << "\n"; savefile << "MMIO Accesses Dropped: " << num_mmio_dropped << "\n"; savefile << "MMIO Accesses Remapped: " << num_mmio_remapped << "\n"; savefile << "\n"; savefile << "reads: " << num_reads << "\n"; savefile << "misses: " << num_read_misses << "\n"; savefile << "hits: " << num_read_hits << "\n"; savefile << "miss rate: " << read_miss_rate() << "\n"; savefile << "average latency: " << this->latency_cycles(sum_read_latency, num_reads) << " cycles"; savefile << " (" << this->latency_us(sum_read_latency, num_reads) << " us)\n"; savefile << "average miss latency: " << this->latency_cycles(sum_read_miss_latency, num_read_misses) << " cycles"; savefile << " (" << this->latency_us(sum_read_miss_latency, num_read_misses) << " us)\n"; savefile << "average hit latency: " << this->latency_cycles(sum_read_hit_latency, num_read_hits) << " cycles"; savefile << " (" << this->latency_us(sum_read_hit_latency, num_read_hits) << " us)\n"; savefile << "throughput: " << this->compute_throughput(this->currentClockCycle, num_reads) << " KB/s\n"; savefile << "\n"; savefile << "writes: " << num_writes << "\n"; savefile << "misses: " << num_write_misses << "\n"; savefile << "hits: " << num_write_hits << "\n"; savefile << "miss rate: " << write_miss_rate() << "\n"; savefile << "average latency: " << this->latency_cycles(sum_write_latency, num_writes) << " cycles"; savefile << " (" << this->latency_us(sum_write_latency, num_writes) << " us)\n"; savefile << "average miss latency: " << this->latency_cycles(sum_write_miss_latency, num_write_misses) << " cycles"; savefile << " (" << this->latency_us(sum_write_miss_latency, num_write_misses) << " us)\n"; savefile << "average hit latency: " << this->latency_cycles(sum_write_hit_latency, num_write_hits) << " cycles"; savefile << " (" << this->latency_us(sum_write_hit_latency, num_write_hits) << " us)\n"; savefile << "throughput: " << this->compute_throughput(this->currentClockCycle, num_writes) << " KB/s\n"; savefile << "\n\n"; savefile << "================================================================================\n\n"; savefile << "Pages accessed:\n"; savefile << flush; unordered_map<uint64_t, uint64_t>::iterator it; for (it = pages_used.begin(); it != pages_used.end(); it++) { uint64_t page_addr = (*it).first; uint64_t num_accesses = (*it).second; savefile << hex << "0x" << page_addr << " : " << dec << num_accesses << "\n"; } savefile << "\n\n"; savefile << "================================================================================\n\n"; savefile << "Latency Histogram:\n\n"; savefile << "HISTOGRAM_BIN: " << HISTOGRAM_BIN << "\n"; savefile << "HISTOGRAM_MAX: " << HISTOGRAM_MAX << "\n\n"; for (uint64_t bin = 0; bin <= HISTOGRAM_MAX; bin += HISTOGRAM_BIN) { savefile << bin << ": " << latency_histogram[bin] << "\n"; } savefile << "\n\n"; savefile << "================================================================================\n\n"; savefile << "Set Conflicts:\n\n"; for (uint64_t set = 0; set < NUM_SETS; set++) { // Only print the sets that have greater than 0 conflicts. if (set_conflicts[set]) savefile << set << ": " << set_conflicts[set] << "\n"; } savefile.close(); }