nuca.cc revision 10152
110152Satgutier@umich.edu/***************************************************************************** 210152Satgutier@umich.edu * McPAT/CACTI 310152Satgutier@umich.edu * SOFTWARE LICENSE AGREEMENT 410152Satgutier@umich.edu * Copyright 2012 Hewlett-Packard Development Company, L.P. 510152Satgutier@umich.edu * All Rights Reserved 610152Satgutier@umich.edu * 710152Satgutier@umich.edu * Redistribution and use in source and binary forms, with or without 810152Satgutier@umich.edu * modification, are permitted provided that the following conditions are 910152Satgutier@umich.edu * met: redistributions of source code must retain the above copyright 1010152Satgutier@umich.edu * notice, this list of conditions and the following disclaimer; 1110152Satgutier@umich.edu * redistributions in binary form must reproduce the above copyright 1210152Satgutier@umich.edu * notice, this list of conditions and the following disclaimer in the 1310152Satgutier@umich.edu * documentation and/or other materials provided with the distribution; 1410152Satgutier@umich.edu * neither the name of the copyright holders nor the names of its 1510152Satgutier@umich.edu * contributors may be used to endorse or promote products derived from 1610152Satgutier@umich.edu * this software without specific prior written permission. 1710152Satgutier@umich.edu 1810152Satgutier@umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1910152Satgutier@umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2010152Satgutier@umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2110152Satgutier@umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2210152Satgutier@umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2310152Satgutier@umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2410152Satgutier@umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2510152Satgutier@umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2610152Satgutier@umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2710152Satgutier@umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2810152Satgutier@umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.” 2910152Satgutier@umich.edu * 3010152Satgutier@umich.edu ***************************************************************************/ 3110152Satgutier@umich.edu 3210152Satgutier@umich.edu 3310152Satgutier@umich.edu 3410152Satgutier@umich.edu#include <cassert> 3510152Satgutier@umich.edu 3610152Satgutier@umich.edu#include "Ucache.h" 3710152Satgutier@umich.edu#include "nuca.h" 3810152Satgutier@umich.edu 3910152Satgutier@umich.eduunsigned int MIN_BANKSIZE=65536; 4010152Satgutier@umich.edu#define FIXED_OVERHEAD 55e-12 /* clock skew and jitter in s. Ref: Hrishikesh et al ISCA 01 */ 4110152Satgutier@umich.edu#define LATCH_DELAY 28e-12 /* latch delay in s (later should use FO4 TODO) */ 4210152Satgutier@umich.edu#define CONTR_2_BANK_LAT 0 4310152Satgutier@umich.edu 4410152Satgutier@umich.eduint cont_stats[2 /*l2 or l3*/][5/* cores */][ROUTER_TYPES][7 /*banks*/][8 /* cycle time */]; 4510152Satgutier@umich.edu 4610152Satgutier@umich.edu Nuca::Nuca( 4710152Satgutier@umich.edu TechnologyParameter::DeviceType *dt = &(g_tp.peri_global) 4810152Satgutier@umich.edu ):deviceType(dt) 4910152Satgutier@umich.edu{ 5010152Satgutier@umich.edu init_cont(); 5110152Satgutier@umich.edu} 5210152Satgutier@umich.edu 5310152Satgutier@umich.eduvoid 5410152Satgutier@umich.eduNuca::init_cont() 5510152Satgutier@umich.edu{ 5610152Satgutier@umich.edu FILE *cont; 5710152Satgutier@umich.edu char line[5000]; 5810152Satgutier@umich.edu char jk[5000]; 5910152Satgutier@umich.edu cont = fopen("contention.dat", "r"); 6010152Satgutier@umich.edu if (!cont) { 6110152Satgutier@umich.edu cout << "contention.dat file is missing!\n"; 6210152Satgutier@umich.edu exit(0); 6310152Satgutier@umich.edu } 6410152Satgutier@umich.edu 6510152Satgutier@umich.edu for(int i=0; i<2; i++) { 6610152Satgutier@umich.edu for(int j=2; j<5; j++) { 6710152Satgutier@umich.edu for(int k=0; k<ROUTER_TYPES; k++) { 6810152Satgutier@umich.edu for(int l=0;l<7; l++) { 6910152Satgutier@umich.edu int *temp = cont_stats[i/*l2 or l3*/][j/*core*/][k/*64 or 128 or 256 link bw*/][l /* no banks*/]; 7010152Satgutier@umich.edu assert(fscanf(cont, "%[^\n]\n", line) != EOF); 7110152Satgutier@umich.edu sscanf(line, "%[^:]: %d %d %d %d %d %d %d %d",jk, &temp[0], &temp[1], &temp[2], &temp[3], 7210152Satgutier@umich.edu &temp[4], &temp[5], &temp[6], &temp[7]); 7310152Satgutier@umich.edu } 7410152Satgutier@umich.edu } 7510152Satgutier@umich.edu } 7610152Satgutier@umich.edu } 7710152Satgutier@umich.edu fclose(cont); 7810152Satgutier@umich.edu} 7910152Satgutier@umich.edu 8010152Satgutier@umich.edu void 8110152Satgutier@umich.eduNuca::print_cont_stats() 8210152Satgutier@umich.edu{ 8310152Satgutier@umich.edu for(int i=0; i<2; i++) { 8410152Satgutier@umich.edu for(int j=2; j<5; j++) { 8510152Satgutier@umich.edu for(int k=0; k<ROUTER_TYPES; k++) { 8610152Satgutier@umich.edu for(int l=0;l<7; l++) { 8710152Satgutier@umich.edu for(int m=0;l<7; l++) { 8810152Satgutier@umich.edu cout << cont_stats[i][j][k][l][m] << " "; 8910152Satgutier@umich.edu } 9010152Satgutier@umich.edu cout << endl; 9110152Satgutier@umich.edu } 9210152Satgutier@umich.edu } 9310152Satgutier@umich.edu } 9410152Satgutier@umich.edu } 9510152Satgutier@umich.edu cout << endl; 9610152Satgutier@umich.edu} 9710152Satgutier@umich.edu 9810152Satgutier@umich.eduNuca::~Nuca(){ 9910152Satgutier@umich.edu for (int i = wt_min; i <= wt_max; i++) { 10010152Satgutier@umich.edu delete wire_vertical[i]; 10110152Satgutier@umich.edu delete wire_horizontal[i]; 10210152Satgutier@umich.edu } 10310152Satgutier@umich.edu} 10410152Satgutier@umich.edu 10510152Satgutier@umich.edu/* converts latency (in s) to cycles depending upon the FREQUENCY (in GHz) */ 10610152Satgutier@umich.edu int 10710152Satgutier@umich.eduNuca::calc_cycles(double lat, double oper_freq) 10810152Satgutier@umich.edu{ 10910152Satgutier@umich.edu //TODO: convert latch delay to FO4 */ 11010152Satgutier@umich.edu double cycle_time = (1.0/(oper_freq*1e9)); /*s*/ 11110152Satgutier@umich.edu cycle_time -= LATCH_DELAY; 11210152Satgutier@umich.edu cycle_time -= FIXED_OVERHEAD; 11310152Satgutier@umich.edu 11410152Satgutier@umich.edu return (int)ceil(lat/cycle_time); 11510152Satgutier@umich.edu} 11610152Satgutier@umich.edu 11710152Satgutier@umich.edu 11810152Satgutier@umich.edunuca_org_t::~nuca_org_t() { 11910152Satgutier@umich.edu // if(h_wire) delete h_wire; 12010152Satgutier@umich.edu // if(v_wire) delete v_wire; 12110152Satgutier@umich.edu // if(router) delete router; 12210152Satgutier@umich.edu} 12310152Satgutier@umich.edu 12410152Satgutier@umich.edu/* 12510152Satgutier@umich.edu * Version - 6.0 12610152Satgutier@umich.edu * 12710152Satgutier@umich.edu * Perform exhaustive search across different bank organizatons, 12810152Satgutier@umich.edu * router configurations, grid organizations, and wire models and 12910152Satgutier@umich.edu * find an optimal NUCA organization 13010152Satgutier@umich.edu * For different bank count values 13110152Satgutier@umich.edu * 1. Optimal bank organization is calculated 13210152Satgutier@umich.edu * 2. For each bank organization, find different NUCA organizations 13310152Satgutier@umich.edu * using various router configurations, grid organizations, 13410152Satgutier@umich.edu * and wire models. 13510152Satgutier@umich.edu * 3. NUCA model with the least cost is picked for 13610152Satgutier@umich.edu * this particular bank count 13710152Satgutier@umich.edu * Finally include contention statistics and find the optimal 13810152Satgutier@umich.edu * NUCA configuration 13910152Satgutier@umich.edu */ 14010152Satgutier@umich.edu void 14110152Satgutier@umich.eduNuca::sim_nuca() 14210152Satgutier@umich.edu{ 14310152Satgutier@umich.edu /* temp variables */ 14410152Satgutier@umich.edu int it, ro, wr; 14510152Satgutier@umich.edu int num_cyc; 14610152Satgutier@umich.edu unsigned int i, j, k; 14710152Satgutier@umich.edu unsigned int r, c; 14810152Satgutier@umich.edu int l2_c; 14910152Satgutier@umich.edu int bank_count = 0; 15010152Satgutier@umich.edu uca_org_t ures; 15110152Satgutier@umich.edu nuca_org_t *opt_n; 15210152Satgutier@umich.edu mem_array tag, data; 15310152Satgutier@umich.edu list<nuca_org_t *> nuca_list; 15410152Satgutier@umich.edu Router *router_s[ROUTER_TYPES]; 15510152Satgutier@umich.edu router_s[0] = new Router(64.0, 8, 4, &(g_tp.peri_global)); 15610152Satgutier@umich.edu router_s[0]->print_router(); 15710152Satgutier@umich.edu router_s[1] = new Router(128.0, 8, 4, &(g_tp.peri_global)); 15810152Satgutier@umich.edu router_s[1]->print_router(); 15910152Satgutier@umich.edu router_s[2] = new Router(256.0, 8, 4, &(g_tp.peri_global)); 16010152Satgutier@umich.edu router_s[2]->print_router(); 16110152Satgutier@umich.edu 16210152Satgutier@umich.edu int core_in; // to store no. of cores 16310152Satgutier@umich.edu 16410152Satgutier@umich.edu /* to search diff grid organizations */ 16510152Satgutier@umich.edu double curr_hop, totno_hops, totno_hhops, totno_vhops, tot_lat, 16610152Satgutier@umich.edu curr_acclat; 16710152Satgutier@umich.edu double avg_lat, avg_hop, avg_hhop, avg_vhop, avg_dyn_power, 16810152Satgutier@umich.edu avg_leakage_power; 16910152Satgutier@umich.edu 17010152Satgutier@umich.edu double opt_acclat = INF, opt_avg_lat = INF, opt_tot_lat = INF; 17110152Satgutier@umich.edu int opt_rows = 0; 17210152Satgutier@umich.edu int opt_columns = 0; 17310152Satgutier@umich.edu double opt_totno_hops = 0; 17410152Satgutier@umich.edu double opt_avg_hop = 0; 17510152Satgutier@umich.edu double opt_dyn_power = 0, opt_leakage_power = 0; 17610152Satgutier@umich.edu min_values_t minval; 17710152Satgutier@umich.edu 17810152Satgutier@umich.edu int bank_start = 0; 17910152Satgutier@umich.edu 18010152Satgutier@umich.edu int flit_width = 0; 18110152Satgutier@umich.edu 18210152Satgutier@umich.edu /* vertical and horizontal hop latency values */ 18310152Satgutier@umich.edu int ver_hop_lat, hor_hop_lat; /* in cycles */ 18410152Satgutier@umich.edu 18510152Satgutier@umich.edu 18610152Satgutier@umich.edu /* no. of different bank sizes to consider */ 18710152Satgutier@umich.edu int iterations; 18810152Satgutier@umich.edu 18910152Satgutier@umich.edu 19010152Satgutier@umich.edu g_ip->nuca_cache_sz = g_ip->cache_sz; 19110152Satgutier@umich.edu nuca_list.push_back(new nuca_org_t()); 19210152Satgutier@umich.edu 19310152Satgutier@umich.edu if (g_ip->cache_level == 0) l2_c = 1; 19410152Satgutier@umich.edu else l2_c = 0; 19510152Satgutier@umich.edu 19610152Satgutier@umich.edu if (g_ip->cores <= 4) core_in = 2; 19710152Satgutier@umich.edu else if (g_ip->cores <= 8) core_in = 3; 19810152Satgutier@umich.edu else if (g_ip->cores <= 16) core_in = 4; 19910152Satgutier@umich.edu else {cout << "Number of cores should be <= 16!\n"; exit(0);} 20010152Satgutier@umich.edu 20110152Satgutier@umich.edu 20210152Satgutier@umich.edu // set the lower bound to an appropriate value. this depends on cache associativity 20310152Satgutier@umich.edu if (g_ip->assoc > 2) { 20410152Satgutier@umich.edu i = 2; 20510152Satgutier@umich.edu while (i != g_ip->assoc) { 20610152Satgutier@umich.edu MIN_BANKSIZE *= 2; 20710152Satgutier@umich.edu i *= 2; 20810152Satgutier@umich.edu } 20910152Satgutier@umich.edu } 21010152Satgutier@umich.edu 21110152Satgutier@umich.edu iterations = (int)logtwo((int)g_ip->cache_sz/MIN_BANKSIZE); 21210152Satgutier@umich.edu 21310152Satgutier@umich.edu if (g_ip->force_wiretype) 21410152Satgutier@umich.edu { 21510152Satgutier@umich.edu if (g_ip->wt == Low_swing) { 21610152Satgutier@umich.edu wt_min = Low_swing; 21710152Satgutier@umich.edu wt_max = Low_swing; 21810152Satgutier@umich.edu } 21910152Satgutier@umich.edu else { 22010152Satgutier@umich.edu wt_min = Global; 22110152Satgutier@umich.edu wt_max = Low_swing-1; 22210152Satgutier@umich.edu } 22310152Satgutier@umich.edu } 22410152Satgutier@umich.edu else { 22510152Satgutier@umich.edu wt_min = Global; 22610152Satgutier@umich.edu wt_max = Low_swing; 22710152Satgutier@umich.edu } 22810152Satgutier@umich.edu if (g_ip->nuca_bank_count != 0) { // simulate just one bank 22910152Satgutier@umich.edu if (g_ip->nuca_bank_count != 2 && g_ip->nuca_bank_count != 4 && 23010152Satgutier@umich.edu g_ip->nuca_bank_count != 8 && g_ip->nuca_bank_count != 16 && 23110152Satgutier@umich.edu g_ip->nuca_bank_count != 32 && g_ip->nuca_bank_count != 64) { 23210152Satgutier@umich.edu fprintf(stderr,"Incorrect bank count value! Please fix the value in cache.cfg\n"); 23310152Satgutier@umich.edu } 23410152Satgutier@umich.edu bank_start = (int)logtwo((double)g_ip->nuca_bank_count); 23510152Satgutier@umich.edu iterations = bank_start+1; 23610152Satgutier@umich.edu g_ip->cache_sz = g_ip->cache_sz/g_ip->nuca_bank_count; 23710152Satgutier@umich.edu } 23810152Satgutier@umich.edu cout << "Simulating various NUCA configurations\n"; 23910152Satgutier@umich.edu for (it=bank_start; it<iterations; it++) { /* different bank count values */ 24010152Satgutier@umich.edu ures.tag_array2 = &tag; 24110152Satgutier@umich.edu ures.data_array2 = &data; 24210152Satgutier@umich.edu /* 24310152Satgutier@umich.edu * find the optimal bank organization 24410152Satgutier@umich.edu */ 24510152Satgutier@umich.edu solve(&ures); 24610152Satgutier@umich.edu// output_UCA(&ures); 24710152Satgutier@umich.edu bank_count = g_ip->nuca_cache_sz/g_ip->cache_sz; 24810152Satgutier@umich.edu cout << "====" << g_ip->cache_sz << "\n"; 24910152Satgutier@umich.edu 25010152Satgutier@umich.edu for (wr=wt_min; wr<=wt_max; wr++) { 25110152Satgutier@umich.edu 25210152Satgutier@umich.edu for (ro=0; ro<ROUTER_TYPES; ro++) 25310152Satgutier@umich.edu { 25410152Satgutier@umich.edu flit_width = (int) router_s[ro]->flit_size; //initialize router 25510152Satgutier@umich.edu nuca_list.back()->nuca_pda.cycle_time = router_s[ro]->cycle_time; 25610152Satgutier@umich.edu 25710152Satgutier@umich.edu /* calculate router and wire parameters */ 25810152Satgutier@umich.edu 25910152Satgutier@umich.edu double vlength = ures.cache_ht; /* length of the wire (u)*/ 26010152Satgutier@umich.edu double hlength = ures.cache_len; // u 26110152Satgutier@umich.edu 26210152Satgutier@umich.edu /* find delay, area, and power for wires */ 26310152Satgutier@umich.edu wire_vertical[wr] = new Wire((enum Wire_type) wr, vlength); 26410152Satgutier@umich.edu wire_horizontal[wr] = new Wire((enum Wire_type) wr, hlength); 26510152Satgutier@umich.edu 26610152Satgutier@umich.edu 26710152Satgutier@umich.edu hor_hop_lat = calc_cycles(wire_horizontal[wr]->delay, 26810152Satgutier@umich.edu 1/(nuca_list.back()->nuca_pda.cycle_time*.001)); 26910152Satgutier@umich.edu ver_hop_lat = calc_cycles(wire_vertical[wr]->delay, 27010152Satgutier@umich.edu 1/(nuca_list.back()->nuca_pda.cycle_time*.001)); 27110152Satgutier@umich.edu 27210152Satgutier@umich.edu /* 27310152Satgutier@umich.edu * assume a grid like topology and explore for optimal network 27410152Satgutier@umich.edu * configuration using different row and column count values. 27510152Satgutier@umich.edu */ 27610152Satgutier@umich.edu for (c=1; c<=(unsigned int)bank_count; c++) { 27710152Satgutier@umich.edu while (bank_count%c != 0) c++; 27810152Satgutier@umich.edu r = bank_count/c; 27910152Satgutier@umich.edu 28010152Satgutier@umich.edu /* 28110152Satgutier@umich.edu * to find the avg access latency of a NUCA cache, uncontended 28210152Satgutier@umich.edu * access time to each bank from the 28310152Satgutier@umich.edu * cache controller is calculated. 28410152Satgutier@umich.edu * avg latency = 28510152Satgutier@umich.edu * sum of the access latencies to individual banks)/bank 28610152Satgutier@umich.edu * count value. 28710152Satgutier@umich.edu */ 28810152Satgutier@umich.edu totno_hops = totno_hhops = totno_vhops = tot_lat = 0; 28910152Satgutier@umich.edu k = 1; 29010152Satgutier@umich.edu for (i=0; i<r; i++) { 29110152Satgutier@umich.edu for (j=0; j<c; j++) { 29210152Satgutier@umich.edu /* 29310152Satgutier@umich.edu * vertical hops including the 29410152Satgutier@umich.edu * first hop from the cache controller 29510152Satgutier@umich.edu */ 29610152Satgutier@umich.edu curr_hop = i + 1; 29710152Satgutier@umich.edu curr_hop += j; /* horizontal hops */ 29810152Satgutier@umich.edu totno_hhops += j; 29910152Satgutier@umich.edu totno_vhops += (i+1); 30010152Satgutier@umich.edu curr_acclat = (i * ver_hop_lat + CONTR_2_BANK_LAT + 30110152Satgutier@umich.edu j * hor_hop_lat); 30210152Satgutier@umich.edu 30310152Satgutier@umich.edu tot_lat += curr_acclat; 30410152Satgutier@umich.edu totno_hops += curr_hop; 30510152Satgutier@umich.edu } 30610152Satgutier@umich.edu } 30710152Satgutier@umich.edu avg_lat = tot_lat/bank_count; 30810152Satgutier@umich.edu avg_hop = totno_hops/bank_count; 30910152Satgutier@umich.edu avg_hhop = totno_hhops/bank_count; 31010152Satgutier@umich.edu avg_vhop = totno_vhops/bank_count; 31110152Satgutier@umich.edu 31210152Satgutier@umich.edu /* net access latency */ 31310152Satgutier@umich.edu curr_acclat = 2*avg_lat + 2*(router_s[ro]->delay*avg_hop) + 31410152Satgutier@umich.edu calc_cycles(ures.access_time, 31510152Satgutier@umich.edu 1/(nuca_list.back()->nuca_pda.cycle_time*.001)); 31610152Satgutier@umich.edu 31710152Satgutier@umich.edu /* avg access lat of nuca */ 31810152Satgutier@umich.edu avg_dyn_power = 31910152Satgutier@umich.edu avg_hop * 32010152Satgutier@umich.edu (router_s[ro]->power.readOp.dynamic) + avg_hhop * 32110152Satgutier@umich.edu (wire_horizontal[wr]->power.readOp.dynamic) * 32210152Satgutier@umich.edu (g_ip->block_sz*8 + 64) + avg_vhop * 32310152Satgutier@umich.edu (wire_vertical[wr]->power.readOp.dynamic) * 32410152Satgutier@umich.edu (g_ip->block_sz*8 + 64) + ures.power.readOp.dynamic; 32510152Satgutier@umich.edu 32610152Satgutier@umich.edu avg_leakage_power = 32710152Satgutier@umich.edu bank_count * router_s[ro]->power.readOp.leakage + 32810152Satgutier@umich.edu avg_hhop * (wire_horizontal[wr]->power.readOp.leakage* 32910152Satgutier@umich.edu wire_horizontal[wr]->delay) * flit_width + 33010152Satgutier@umich.edu avg_vhop * (wire_vertical[wr]->power.readOp.leakage * 33110152Satgutier@umich.edu wire_horizontal[wr]->delay); 33210152Satgutier@umich.edu 33310152Satgutier@umich.edu if (curr_acclat < opt_acclat) { 33410152Satgutier@umich.edu opt_acclat = curr_acclat; 33510152Satgutier@umich.edu opt_tot_lat = tot_lat; 33610152Satgutier@umich.edu opt_avg_lat = avg_lat; 33710152Satgutier@umich.edu opt_totno_hops = totno_hops; 33810152Satgutier@umich.edu opt_avg_hop = avg_hop; 33910152Satgutier@umich.edu opt_rows = r; 34010152Satgutier@umich.edu opt_columns = c; 34110152Satgutier@umich.edu opt_dyn_power = avg_dyn_power; 34210152Satgutier@umich.edu opt_leakage_power = avg_leakage_power; 34310152Satgutier@umich.edu } 34410152Satgutier@umich.edu totno_hops = 0; 34510152Satgutier@umich.edu tot_lat = 0; 34610152Satgutier@umich.edu totno_hhops = 0; 34710152Satgutier@umich.edu totno_vhops = 0; 34810152Satgutier@umich.edu } 34910152Satgutier@umich.edu nuca_list.back()->wire_pda.power.readOp.dynamic = 35010152Satgutier@umich.edu opt_avg_hop * flit_width * 35110152Satgutier@umich.edu (wire_horizontal[wr]->power.readOp.dynamic + 35210152Satgutier@umich.edu wire_vertical[wr]->power.readOp.dynamic); 35310152Satgutier@umich.edu nuca_list.back()->avg_hops = opt_avg_hop; 35410152Satgutier@umich.edu /* network delay/power */ 35510152Satgutier@umich.edu nuca_list.back()->h_wire = wire_horizontal[wr]; 35610152Satgutier@umich.edu nuca_list.back()->v_wire = wire_vertical[wr]; 35710152Satgutier@umich.edu nuca_list.back()->router = router_s[ro]; 35810152Satgutier@umich.edu /* bank delay/power */ 35910152Satgutier@umich.edu 36010152Satgutier@umich.edu nuca_list.back()->bank_pda.delay = ures.access_time; 36110152Satgutier@umich.edu nuca_list.back()->bank_pda.power = ures.power; 36210152Satgutier@umich.edu nuca_list.back()->bank_pda.area.h = ures.cache_ht; 36310152Satgutier@umich.edu nuca_list.back()->bank_pda.area.w = ures.cache_len; 36410152Satgutier@umich.edu nuca_list.back()->bank_pda.cycle_time = ures.cycle_time; 36510152Satgutier@umich.edu 36610152Satgutier@umich.edu num_cyc = calc_cycles(nuca_list.back()->bank_pda.delay /*s*/, 36710152Satgutier@umich.edu 1/(nuca_list.back()->nuca_pda.cycle_time*.001/*GHz*/)); 36810152Satgutier@umich.edu if(num_cyc%2 != 0) num_cyc++; 36910152Satgutier@umich.edu if (num_cyc > 16) num_cyc = 16; // we have data only up to 16 cycles 37010152Satgutier@umich.edu 37110152Satgutier@umich.edu if (it < 7) { 37210152Satgutier@umich.edu nuca_list.back()->nuca_pda.delay = opt_acclat + 37310152Satgutier@umich.edu cont_stats[l2_c][core_in][ro][it][num_cyc/2-1]; 37410152Satgutier@umich.edu nuca_list.back()->contention = 37510152Satgutier@umich.edu cont_stats[l2_c][core_in][ro][it][num_cyc/2-1]; 37610152Satgutier@umich.edu } 37710152Satgutier@umich.edu else { 37810152Satgutier@umich.edu nuca_list.back()->nuca_pda.delay = opt_acclat + 37910152Satgutier@umich.edu cont_stats[l2_c][core_in][ro][7][num_cyc/2-1]; 38010152Satgutier@umich.edu nuca_list.back()->contention = 38110152Satgutier@umich.edu cont_stats[l2_c][core_in][ro][7][num_cyc/2-1]; 38210152Satgutier@umich.edu } 38310152Satgutier@umich.edu nuca_list.back()->nuca_pda.power.readOp.dynamic = opt_dyn_power; 38410152Satgutier@umich.edu nuca_list.back()->nuca_pda.power.readOp.leakage = opt_leakage_power; 38510152Satgutier@umich.edu 38610152Satgutier@umich.edu /* array organization */ 38710152Satgutier@umich.edu nuca_list.back()->bank_count = bank_count; 38810152Satgutier@umich.edu nuca_list.back()->rows = opt_rows; 38910152Satgutier@umich.edu nuca_list.back()->columns = opt_columns; 39010152Satgutier@umich.edu calculate_nuca_area (nuca_list.back()); 39110152Satgutier@umich.edu 39210152Satgutier@umich.edu minval.update_min_values(nuca_list.back()); 39310152Satgutier@umich.edu nuca_list.push_back(new nuca_org_t()); 39410152Satgutier@umich.edu opt_acclat = BIGNUM; 39510152Satgutier@umich.edu 39610152Satgutier@umich.edu } 39710152Satgutier@umich.edu } 39810152Satgutier@umich.edu g_ip->cache_sz /= 2; 39910152Satgutier@umich.edu } 40010152Satgutier@umich.edu 40110152Satgutier@umich.edu delete(nuca_list.back()); 40210152Satgutier@umich.edu nuca_list.pop_back(); 40310152Satgutier@umich.edu opt_n = find_optimal_nuca(&nuca_list, &minval); 40410152Satgutier@umich.edu print_nuca(opt_n); 40510152Satgutier@umich.edu g_ip->cache_sz = g_ip->nuca_cache_sz/opt_n->bank_count; 40610152Satgutier@umich.edu 40710152Satgutier@umich.edu list<nuca_org_t *>::iterator niter; 40810152Satgutier@umich.edu for (niter = nuca_list.begin(); niter != nuca_list.end(); ++niter) 40910152Satgutier@umich.edu { 41010152Satgutier@umich.edu delete *niter; 41110152Satgutier@umich.edu } 41210152Satgutier@umich.edu nuca_list.clear(); 41310152Satgutier@umich.edu 41410152Satgutier@umich.edu for(int i=0; i < ROUTER_TYPES; i++) 41510152Satgutier@umich.edu { 41610152Satgutier@umich.edu delete router_s[i]; 41710152Satgutier@umich.edu } 41810152Satgutier@umich.edu g_ip->display_ip(); 41910152Satgutier@umich.edu // g_ip->force_cache_config = true; 42010152Satgutier@umich.edu // g_ip->ndwl = 8; 42110152Satgutier@umich.edu // g_ip->ndbl = 16; 42210152Satgutier@umich.edu // g_ip->nspd = 4; 42310152Satgutier@umich.edu // g_ip->ndcm = 1; 42410152Satgutier@umich.edu // g_ip->ndsam1 = 8; 42510152Satgutier@umich.edu // g_ip->ndsam2 = 32; 42610152Satgutier@umich.edu 42710152Satgutier@umich.edu} 42810152Satgutier@umich.edu 42910152Satgutier@umich.edu 43010152Satgutier@umich.edu void 43110152Satgutier@umich.eduNuca::print_nuca (nuca_org_t *fr) 43210152Satgutier@umich.edu{ 43310152Satgutier@umich.edu printf("\n---------- CACTI version 6.5, Non-uniform Cache Access " 43410152Satgutier@umich.edu "----------\n\n"); 43510152Satgutier@umich.edu printf("Optimal number of banks - %d\n", fr->bank_count); 43610152Satgutier@umich.edu printf("Grid organization rows x columns - %d x %d\n", 43710152Satgutier@umich.edu fr->rows, fr->columns); 43810152Satgutier@umich.edu printf("Network frequency - %g GHz\n", 43910152Satgutier@umich.edu (1/fr->nuca_pda.cycle_time)*1e3); 44010152Satgutier@umich.edu printf("Cache dimension (mm x mm) - %g x %g\n", 44110152Satgutier@umich.edu fr->nuca_pda.area.h, 44210152Satgutier@umich.edu fr->nuca_pda.area.w); 44310152Satgutier@umich.edu 44410152Satgutier@umich.edu fr->router->print_router(); 44510152Satgutier@umich.edu 44610152Satgutier@umich.edu printf("\n\nWire stats:\n"); 44710152Satgutier@umich.edu if (fr->h_wire->wt == Global) { 44810152Satgutier@umich.edu printf("\tWire type - Full swing global wires with least " 44910152Satgutier@umich.edu "possible delay\n"); 45010152Satgutier@umich.edu } 45110152Satgutier@umich.edu else if (fr->h_wire->wt == Global_5) { 45210152Satgutier@umich.edu printf("\tWire type - Full swing global wires with " 45310152Satgutier@umich.edu "5%% delay penalty\n"); 45410152Satgutier@umich.edu } 45510152Satgutier@umich.edu else if (fr->h_wire->wt == Global_10) { 45610152Satgutier@umich.edu printf("\tWire type - Full swing global wires with " 45710152Satgutier@umich.edu "10%% delay penalty\n"); 45810152Satgutier@umich.edu } 45910152Satgutier@umich.edu else if (fr->h_wire->wt == Global_20) { 46010152Satgutier@umich.edu printf("\tWire type - Full swing global wires with " 46110152Satgutier@umich.edu "20%% delay penalty\n"); 46210152Satgutier@umich.edu } 46310152Satgutier@umich.edu else if (fr->h_wire->wt == Global_30) { 46410152Satgutier@umich.edu printf("\tWire type - Full swing global wires with " 46510152Satgutier@umich.edu "30%% delay penalty\n"); 46610152Satgutier@umich.edu } 46710152Satgutier@umich.edu else if(fr->h_wire->wt == Low_swing) { 46810152Satgutier@umich.edu printf("\tWire type - Low swing wires\n"); 46910152Satgutier@umich.edu } 47010152Satgutier@umich.edu 47110152Satgutier@umich.edu printf("\tHorizontal link delay - %g (ns)\n", 47210152Satgutier@umich.edu fr->h_wire->delay*1e9); 47310152Satgutier@umich.edu printf("\tVertical link delay - %g (ns)\n", 47410152Satgutier@umich.edu fr->v_wire->delay*1e9); 47510152Satgutier@umich.edu printf("\tDelay/length - %g (ns/mm)\n", 47610152Satgutier@umich.edu fr->h_wire->delay*1e9/fr->bank_pda.area.w); 47710152Satgutier@umich.edu printf("\tHorizontal link energy -dynamic/access %g (nJ)\n" 47810152Satgutier@umich.edu "\t -leakage %g (nW)\n\n", 47910152Satgutier@umich.edu fr->h_wire->power.readOp.dynamic*1e9, 48010152Satgutier@umich.edu fr->h_wire->power.readOp.leakage*1e9); 48110152Satgutier@umich.edu printf("\tVertical link energy -dynamic/access %g (nJ)\n" 48210152Satgutier@umich.edu "\t -leakage %g (nW)\n\n", 48310152Satgutier@umich.edu fr->v_wire->power.readOp.dynamic*1e9, 48410152Satgutier@umich.edu fr->v_wire->power.readOp.leakage*1e9); 48510152Satgutier@umich.edu printf("\n\n"); 48610152Satgutier@umich.edu fr->v_wire->print_wire(); 48710152Satgutier@umich.edu printf("\n\nBank stats:\n"); 48810152Satgutier@umich.edu} 48910152Satgutier@umich.edu 49010152Satgutier@umich.edu 49110152Satgutier@umich.edu nuca_org_t * 49210152Satgutier@umich.eduNuca::find_optimal_nuca (list<nuca_org_t *> *n, min_values_t *minval) 49310152Satgutier@umich.edu{ 49410152Satgutier@umich.edu double cost = 0; 49510152Satgutier@umich.edu double min_cost = BIGNUM; 49610152Satgutier@umich.edu nuca_org_t *res = NULL; 49710152Satgutier@umich.edu float d, a, dp, lp, c; 49810152Satgutier@umich.edu int v; 49910152Satgutier@umich.edu dp = g_ip->dynamic_power_wt_nuca; 50010152Satgutier@umich.edu lp = g_ip->leakage_power_wt_nuca; 50110152Satgutier@umich.edu a = g_ip->area_wt_nuca; 50210152Satgutier@umich.edu d = g_ip->delay_wt_nuca; 50310152Satgutier@umich.edu c = g_ip->cycle_time_wt_nuca; 50410152Satgutier@umich.edu 50510152Satgutier@umich.edu list<nuca_org_t *>::iterator niter; 50610152Satgutier@umich.edu 50710152Satgutier@umich.edu 50810152Satgutier@umich.edu for (niter = n->begin(); niter != n->end(); niter++) { 50910152Satgutier@umich.edu fprintf(stderr, "\n-----------------------------" 51010152Satgutier@umich.edu "---------------\n"); 51110152Satgutier@umich.edu 51210152Satgutier@umich.edu 51310152Satgutier@umich.edu printf("NUCA___stats %d \tbankcount: lat = %g \tdynP = %g \twt = %d\t " 51410152Satgutier@umich.edu "bank_dpower = %g \tleak = %g \tcycle = %g\n", 51510152Satgutier@umich.edu (*niter)->bank_count, 51610152Satgutier@umich.edu (*niter)->nuca_pda.delay, 51710152Satgutier@umich.edu (*niter)->nuca_pda.power.readOp.dynamic, 51810152Satgutier@umich.edu (*niter)->h_wire->wt, 51910152Satgutier@umich.edu (*niter)->bank_pda.power.readOp.dynamic, 52010152Satgutier@umich.edu (*niter)->nuca_pda.power.readOp.leakage, 52110152Satgutier@umich.edu (*niter)->nuca_pda.cycle_time); 52210152Satgutier@umich.edu 52310152Satgutier@umich.edu 52410152Satgutier@umich.edu if (g_ip->ed == 1) { 52510152Satgutier@umich.edu cost = ((*niter)->nuca_pda.delay/minval->min_delay)* 52610152Satgutier@umich.edu ((*niter)->nuca_pda.power.readOp.dynamic/minval->min_dyn); 52710152Satgutier@umich.edu if (min_cost > cost) { 52810152Satgutier@umich.edu min_cost = cost; 52910152Satgutier@umich.edu res = ((*niter)); 53010152Satgutier@umich.edu } 53110152Satgutier@umich.edu } 53210152Satgutier@umich.edu else if (g_ip->ed == 2) { 53310152Satgutier@umich.edu cost = ((*niter)->nuca_pda.delay/minval->min_delay)* 53410152Satgutier@umich.edu ((*niter)->nuca_pda.delay/minval->min_delay)* 53510152Satgutier@umich.edu ((*niter)->nuca_pda.power.readOp.dynamic/minval->min_dyn); 53610152Satgutier@umich.edu if (min_cost > cost) { 53710152Satgutier@umich.edu min_cost = cost; 53810152Satgutier@umich.edu res = ((*niter)); 53910152Satgutier@umich.edu } 54010152Satgutier@umich.edu } 54110152Satgutier@umich.edu else { 54210152Satgutier@umich.edu /* 54310152Satgutier@umich.edu * check whether the current organization 54410152Satgutier@umich.edu * meets the input deviation constraints 54510152Satgutier@umich.edu */ 54610152Satgutier@umich.edu v = check_nuca_org((*niter), minval); 54710152Satgutier@umich.edu if (minval->min_leakage == 0) minval->min_leakage = 0.1; //FIXME remove this after leakage modeling 54810152Satgutier@umich.edu 54910152Satgutier@umich.edu if (v) { 55010152Satgutier@umich.edu cost = (d * ((*niter)->nuca_pda.delay/minval->min_delay) + 55110152Satgutier@umich.edu c * ((*niter)->nuca_pda.cycle_time/minval->min_cyc) + 55210152Satgutier@umich.edu dp * ((*niter)->nuca_pda.power.readOp.dynamic/minval->min_dyn) + 55310152Satgutier@umich.edu lp * ((*niter)->nuca_pda.power.readOp.leakage/minval->min_leakage) + 55410152Satgutier@umich.edu a * ((*niter)->nuca_pda.area.get_area()/minval->min_area)); 55510152Satgutier@umich.edu fprintf(stderr, "cost = %g\n", cost); 55610152Satgutier@umich.edu 55710152Satgutier@umich.edu if (min_cost > cost) { 55810152Satgutier@umich.edu min_cost = cost; 55910152Satgutier@umich.edu res = ((*niter)); 56010152Satgutier@umich.edu } 56110152Satgutier@umich.edu } 56210152Satgutier@umich.edu else { 56310152Satgutier@umich.edu niter = n->erase(niter); 56410152Satgutier@umich.edu if (niter !=n->begin()) 56510152Satgutier@umich.edu niter --; 56610152Satgutier@umich.edu } 56710152Satgutier@umich.edu } 56810152Satgutier@umich.edu } 56910152Satgutier@umich.edu return res; 57010152Satgutier@umich.edu} 57110152Satgutier@umich.edu 57210152Satgutier@umich.edu int 57310152Satgutier@umich.eduNuca::check_nuca_org (nuca_org_t *n, min_values_t *minval) 57410152Satgutier@umich.edu{ 57510152Satgutier@umich.edu if (((n->nuca_pda.delay - minval->min_delay)*100/minval->min_delay) > g_ip->delay_dev_nuca) { 57610152Satgutier@umich.edu return 0; 57710152Satgutier@umich.edu } 57810152Satgutier@umich.edu if (((n->nuca_pda.power.readOp.dynamic - minval->min_dyn)/minval->min_dyn)*100 > 57910152Satgutier@umich.edu g_ip->dynamic_power_dev_nuca) { 58010152Satgutier@umich.edu return 0; 58110152Satgutier@umich.edu } 58210152Satgutier@umich.edu if (((n->nuca_pda.power.readOp.leakage - minval->min_leakage)/minval->min_leakage)*100 > 58310152Satgutier@umich.edu g_ip->leakage_power_dev_nuca) { 58410152Satgutier@umich.edu return 0; 58510152Satgutier@umich.edu } 58610152Satgutier@umich.edu if (((n->nuca_pda.cycle_time - minval->min_cyc)/minval->min_cyc)*100 > 58710152Satgutier@umich.edu g_ip->cycle_time_dev_nuca) { 58810152Satgutier@umich.edu return 0; 58910152Satgutier@umich.edu } 59010152Satgutier@umich.edu if (((n->nuca_pda.area.get_area() - minval->min_area)/minval->min_area)*100 > 59110152Satgutier@umich.edu g_ip->area_dev_nuca) { 59210152Satgutier@umich.edu return 0; 59310152Satgutier@umich.edu } 59410152Satgutier@umich.edu return 1; 59510152Satgutier@umich.edu} 59610152Satgutier@umich.edu 59710152Satgutier@umich.edu void 59810152Satgutier@umich.eduNuca::calculate_nuca_area (nuca_org_t *nuca) 59910152Satgutier@umich.edu{ 60010152Satgutier@umich.edu nuca->nuca_pda.area.h= 60110152Satgutier@umich.edu nuca->rows * ((nuca->h_wire->wire_width + 60210152Satgutier@umich.edu nuca->h_wire->wire_spacing) 60310152Satgutier@umich.edu * nuca->router->flit_size + 60410152Satgutier@umich.edu nuca->bank_pda.area.h); 60510152Satgutier@umich.edu 60610152Satgutier@umich.edu nuca->nuca_pda.area.w = 60710152Satgutier@umich.edu nuca->columns * ((nuca->v_wire->wire_width + 60810152Satgutier@umich.edu nuca->v_wire->wire_spacing) 60910152Satgutier@umich.edu * nuca->router->flit_size + 61010152Satgutier@umich.edu nuca->bank_pda.area.w); 61110152Satgutier@umich.edu} 61210152Satgutier@umich.edu 613