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