Ejemplo n.º 1
0
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));
}
Ejemplo n.º 2
0
unsigned int average_access_time(struct cache *cache)
{
	return hit_time(cache) + miss_rate(cache) * miss_penalty(cache);
}
Ejemplo n.º 3
0
	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();
	}