aboutsummaryrefslogtreecommitdiff
path: root/src/gpuwattch/cacti/highradix.cc
diff options
context:
space:
mode:
authorVijayKandiah <[email protected]>2021-10-17 02:18:10 -0500
committerVijayKandiah <[email protected]>2021-10-17 02:18:10 -0500
commit84c6cf45131e42b1a724ebf7977987a9ddb70db9 (patch)
treee82f15238e79a03f3cc2435d4f9bb48d5023e8ae /src/gpuwattch/cacti/highradix.cc
parent4a4fc87a2dcd95bfe298f2b3d18a9833a506e499 (diff)
AccelWattch dev Integration
Diffstat (limited to 'src/gpuwattch/cacti/highradix.cc')
-rw-r--r--src/gpuwattch/cacti/highradix.cc392
1 files changed, 0 insertions, 392 deletions
diff --git a/src/gpuwattch/cacti/highradix.cc b/src/gpuwattch/cacti/highradix.cc
deleted file mode 100644
index e06cad7..0000000
--- a/src/gpuwattch/cacti/highradix.cc
+++ /dev/null
@@ -1,392 +0,0 @@
-/*------------------------------------------------------------
- * CACTI 6.5
- * Copyright 2008 Hewlett-Packard Development Corporation
- * All Rights Reserved
- *
- * Permission to use, copy, and modify this software and its documentation is
- * hereby granted only under the following terms and conditions. Both the
- * above copyright notice and this permission notice must appear in all copies
- * of the software, derivative works or modified versions, and any portions
- * thereof, and both notices must appear in supporting documentation.
- *
- * Users of this software agree to the terms and conditions set forth herein, and
- * hereby grant back to Hewlett-Packard Company and its affiliated companies ("HP")
- * a non-exclusive, unrestricted, royalty-free right and license under any changes,
- * enhancements or extensions made to the core functions of the software, including
- * but not limited to those affording compatibility with other hardware or software
- * environments, but excluding applications which incorporate this software.
- * Users further agree to use their best efforts to return to HP any such changes,
- * enhancements or extensions that they make and inform HP of noteworthy uses of
- * this software. Correspondence should be provided to HP at:
- *
- * Director of Intellectual Property Licensing
- * Office of Strategy and Technology
- * Hewlett-Packard Company
- * 1501 Page Mill Road
- * Palo Alto, California 94304
- *
- * This software may be distributed (but not offered for sale or transferred
- * for compensation) to third parties, provided such third parties agree to
- * abide by the terms and conditions of this notice.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND HP DISCLAIMS ALL
- * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL HP
- * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
- * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
- * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
- * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
- * SOFTWARE.
- *------------------------------------------------------------*/
-
-#include "highradix.h"
-#include <iomanip>
-using namespace std;
-
-#define MAX_WIRE_SCALE 1
-
-HighRadix::HighRadix(
- double SUB_SWITCH_SZ_,
- double ROWS_,
- double FREQUENCY_, // GHz
- double RADIX_,
- double VC_COUNT_,
- double FLIT_SZ_,
- double AF_,// activity factor
- double DIE_LEN_,//u
- double DIE_HT_,//u
- double INP_BUFF_ENT_,
- double ROW_BUFF_ENT_,
- double COL_BUFF_ENT_,
- TechnologyParameter::DeviceType *dt
- ):SUB_SWITCH_SZ(SUB_SWITCH_SZ_), ROWS(ROWS_), FREQUENCY(FREQUENCY_),
- RADIX(RADIX_), VC_COUNT(VC_COUNT_), FLIT_SZ(FLIT_SZ_), AF(AF_),
- DIE_LEN(DIE_LEN_), DIE_HT(DIE_HT_), INP_BUFF_ENT(INP_BUFF_ENT_),
- ROW_BUFF_ENT(ROW_BUFF_ENT_), COL_BUFF_ENT(COL_BUFF_ENT_), deviceType(dt)
-{
- double area_scale=1;
- double tech_init = 90;
- if (g_ip->F_sz_nm == 65) {
- area_scale*=1;
- }
- else if(g_ip->F_sz_nm == 45) {
- area_scale*=1;
- }
- else if(g_ip->F_sz_nm == 32) {
- area_scale*=2;
- }
-
- DIE_LEN = sqrt(DIE_LEN_*DIE_HT_/area_scale);
- DIE_HT = DIE_LEN;
-
- COLUMNS = pow(RADIX/SUB_SWITCH_SZ, 2)/ROWS;
- INP_BUFF_SZ = FLIT_SZ * INP_BUFF_ENT;
- ROW_BUFF_SZ = ROW_BUFF_ENT * FLIT_SZ;
- COL_BUFF_SZ = COL_BUFF_ENT * FLIT_SZ;
- area.set_area(0);
-}
-
-void
-HighRadix::compute_power()
-{
- num_sub = ROWS * COLUMNS;
- //FIXME change cb power to per input
-
- double scale = 1;
- while (true) {
- Wire winit(scale, scale);
- cb = new Crossbar(SUB_SWITCH_SZ, SUB_SWITCH_SZ, FLIT_SZ);
- cb->compute_power();
- if (cb->delay*1e12 < (1/FREQUENCY)*(1e3))
- break;
- else {
- scale+=0.2;
- if (scale > MAX_WIRE_SCALE) break;
- cout << "scale = " << scale << endl;
- }
- }
- cb->power.readOp.dynamic /= SUB_SWITCH_SZ; // crossbar power per message
- scale = 1;
-
- while (true) {
- Wire winit(scale, scale);
- out_cb = new Crossbar(1, SUB_SWITCH_SZ, FLIT_SZ);
- out_cb->compute_power();
- if (out_cb->delay*1e12 < (1/FREQUENCY)*(1e3))
- break;
- else {
- scale+=0.2;
- if (scale > MAX_WIRE_SCALE) break;
- cout << "scale = " << scale << endl;
- }
- }
- Wire winit;
- out_cb->power.readOp.dynamic /= SUB_SWITCH_SZ; // power per message
-
- //arbiter initialization
- vc_arb = new MCPAT_Arbiter(VC_COUNT, FLIT_SZ, cb->area.w);
- vc_arb->compute_power();
- c_arb = new MCPAT_Arbiter(COLUMNS, FLIT_SZ, cb->area.w);
- c_arb->compute_power();
- cb_arb = new MCPAT_Arbiter(RADIX/ROWS, FLIT_SZ, cb->area.w);
- cb_arb->compute_power();
-
- // input buffer, row/column buffer initialization
- inp_buff = buffer_(FLIT_SZ, INP_BUFF_SZ);
- c_buff = buffer_(FLIT_SZ, COL_BUFF_SZ*2);
- r_buff = buffer_(FLIT_SZ, ROW_BUFF_SZ*2);
-
-
- // repeated wire initialization
- hor_bus = new Wire(g_ip->wt, DIE_LEN);
- // effective ht of vertical bus (connecting cb to column buffer) in each sub-switch
- double eff_ht = (ROWS * (ROWS +1)/2) * (DIE_HT/ROWS);
- ver_bus = new Wire(g_ip->wt, eff_ht);
-
- // sub switch includes row buffers, column buffers, vc/crossbar/column arbitration and a 2 stage crossbar traversal
- sub_switch_power();
- power.readOp.dynamic += sub_sw.power.readOp.dynamic * num_sub;
- power.readOp.leakage += sub_sw.power.readOp.leakage * num_sub;
-
- // input buffer power
- power.readOp.dynamic += 2 /*r&w*/ * inp_buff->power.readOp.dynamic * RADIX;
- power.readOp.leakage += inp_buff->power.readOp.leakage * RADIX;
-
- // buses
- power.readOp.dynamic += hor_bus->power.readOp.dynamic * FLIT_SZ * SUB_SWITCH_SZ * ROWS;
- power.readOp.leakage += hor_bus->power.readOp.leakage * FLIT_SZ * SUB_SWITCH_SZ * ROWS;
- power.readOp.dynamic += ver_bus->power.readOp.dynamic * FLIT_SZ * COLUMNS * SUB_SWITCH_SZ;
- power.readOp.leakage += ver_bus->power.readOp.leakage * FLIT_SZ * ROWS * COLUMNS * SUB_SWITCH_SZ;
-
- // To calculate contribution of each component to the total power
- compute_crossbar_power();
- compute_bus_power();
- compute_arb_power();
- compute_buff_power();
-
- //area
- sub_sw.area.set_area(sub_sw.area.get_area() + cb->area.get_area());
- sub_sw.area.set_area(sub_sw.area.get_area() + out_cb->area.get_area());
- sub_sw.area.set_area(sub_sw.area.get_area() + r_buff->area.get_area() * VC_COUNT * SUB_SWITCH_SZ);
- sub_sw.area.set_area(sub_sw.area.get_area() + c_buff->area.get_area() * VC_COUNT * SUB_SWITCH_SZ);
-
- buff_tot.area.set_area(buff_tot.area.get_area() + inp_buff->area.get_area() * RADIX);
- buff_tot.area.set_area(buff_tot.area.get_area() + VC_COUNT * r_buff->area.get_area() * SUB_SWITCH_SZ * num_sub);
- buff_tot.area.set_area(buff_tot.area.get_area() + VC_COUNT * c_buff->area.get_area() * SUB_SWITCH_SZ * num_sub);
-
- crossbar_tot.area.set_area(crossbar_tot.area.get_area() + cb->area.get_area() * num_sub);
- crossbar_tot.area.set_area(crossbar_tot.area.get_area() + out_cb->area.get_area() * num_sub);
-
- wire_tot.area.set_area(hor_bus->area.get_area() * FLIT_SZ * SUB_SWITCH_SZ * ROWS);
- wire_tot.area.set_area(ver_bus->area.get_area() * FLIT_SZ * ROWS * COLUMNS);
-}
-
-void HighRadix::compute_crossbar_power()
-{
- crossbar_tot.power = cb->power;
- crossbar_tot.power = crossbar_tot.power + out_cb->power;
- crossbar_tot.power.readOp.dynamic *= num_sub;
- crossbar_tot.power.readOp.leakage *= num_sub;
-}
-
-void HighRadix::compute_bus_power()
-{
- wire_tot.power.readOp.dynamic = hor_bus->power.readOp.dynamic * FLIT_SZ * SUB_SWITCH_SZ * ROWS;
- wire_tot.power.readOp.leakage = hor_bus->power.readOp.leakage * FLIT_SZ * SUB_SWITCH_SZ * ROWS;
- wire_tot.power.readOp.dynamic += ver_bus->power.readOp.dynamic * FLIT_SZ * COLUMNS * SUB_SWITCH_SZ;
- wire_tot.power.readOp.leakage += ver_bus->power.readOp.leakage * FLIT_SZ * ROWS * COLUMNS * SUB_SWITCH_SZ;
-}
-
-void HighRadix::compute_arb_power()
-{
- arb_tot.power = cb_arb->power;
- arb_tot.power = arb_tot.power + vc_arb->power; // for CB traversal
- arb_tot.power = arb_tot.power + c_arb->power;
- arb_tot.power = arb_tot.power + vc_arb->power; // to the o/p port
-
- arb_tot.power.readOp.dynamic *= num_sub;
- arb_tot.power.readOp.leakage *= num_sub;
-}
-
-void HighRadix::compute_buff_power()
-{
- //input buffer read/write
- buff_tot.power.readOp.dynamic = 2 * inp_buff->power.readOp.dynamic * RADIX;
- buff_tot.power.readOp.leakage = inp_buff->power.readOp.leakage * RADIX;
-
- //row buffer read/write
- buff_tot.power.readOp.dynamic += r_buff->power.readOp.dynamic * 2 * num_sub;
- buff_tot.power.readOp.leakage += r_buff->power.readOp.leakage * num_sub;
-
- //column buffer read/write
- buff_tot.power.readOp.dynamic += c_buff->power.readOp.dynamic * 2 * num_sub;
- buff_tot.power.readOp.leakage += c_buff->power.readOp.leakage * num_sub;
-}
-
-void
-HighRadix::sub_switch_power()
-{
- // each sub-switch power
- sub_sw.power.readOp.dynamic = sub_sw.power.readOp.dynamic +
- r_buff->power.readOp.dynamic * 2 /* one read and one write */ * VC_COUNT;
- sub_sw.power.readOp.leakage = sub_sw.power.readOp.leakage +
- r_buff->power.readOp.leakage * VC_COUNT;
- sub_sw.power = sub_sw.power + cb->power;
-
- sub_sw.power.readOp.dynamic = sub_sw.power.readOp.dynamic +
- 2 * c_buff->power.readOp.dynamic /* one read and one write */ * VC_COUNT;
- sub_sw.power.readOp.leakage = sub_sw.power.readOp.leakage +
- c_buff->power.readOp.leakage * VC_COUNT;
- sub_sw.power = sub_sw.power + out_cb->power;
-
- // arbiter power
- sub_sw.power = sub_sw.power + cb_arb->power;
- sub_sw.power = sub_sw.power + vc_arb->power; // for CB traversal
- sub_sw.power = sub_sw.power + c_arb->power;
- sub_sw.power = sub_sw.power + vc_arb->power; // to the o/p port
-}
-
-
-HighRadix::~HighRadix()
-{
- delete inp_buff;
- delete r_buff;
- delete c_buff;
- delete c_arb;
- delete cb_arb;
- delete vc_arb;
- delete out_cb;
-}
-
-Mat * HighRadix::buffer_(double block_sz, double sz)
-{
- DynamicParameter dyn_p;
- dyn_p.is_tag = false;
- dyn_p.num_subarrays = 1;
- dyn_p.num_mats = 1;
- dyn_p.Ndbl = 1;
- dyn_p.Ndwl = 1;
- dyn_p.Nspd = 1;
- dyn_p.deg_bl_muxing = 1;
- dyn_p.deg_senseamp_muxing_non_associativity = 1;
- dyn_p.Ndsam_lev_1 = 1;
- dyn_p.Ndsam_lev_2 = 1;
- dyn_p.number_addr_bits_mat = 8;
- dyn_p.number_way_select_signals_mat = 1;
- dyn_p.num_act_mats_hor_dir = 1;
- dyn_p.is_dram = false;
- dyn_p.V_b_sense = deviceType->Vdd; // FIXME check power calc.
- dyn_p.ram_cell_tech_type =
- dyn_p.num_r_subarray = (int) (sz/block_sz);
- dyn_p.num_c_subarray = (int) block_sz;
- dyn_p.num_mats_h_dir = 1;
- dyn_p.num_mats_v_dir = 1;
- dyn_p.num_do_b_subbank = (int)block_sz;
- dyn_p.num_do_b_mat = (int) block_sz;
- dyn_p.num_di_b_mat = (int) block_sz;
-
- dyn_p.use_inp_params = 1;
- dyn_p.num_wr_ports = 1;
- dyn_p.num_rd_ports = 1;
- dyn_p.num_rw_ports = 0;
- dyn_p.num_se_rd_ports =0;
- dyn_p.out_w = (int) block_sz;
-
-
- dyn_p.cell.h = g_tp.sram.b_h + 2 * g_tp.wire_outside_mat.pitch * (dyn_p.num_wr_ports +
- dyn_p.num_rw_ports - 1 + dyn_p.num_rd_ports);
- dyn_p.cell.w = g_tp.sram.b_w + 2 * g_tp.wire_outside_mat.pitch * (dyn_p.num_rw_ports - 1 +
- (dyn_p.num_rd_ports - dyn_p.num_se_rd_ports) +
- dyn_p.num_wr_ports) + g_tp.wire_outside_mat.pitch * dyn_p.num_se_rd_ports;
-
- Mat *buff = new Mat(dyn_p);
- buff->compute_delays(0);
- buff->compute_power_energy();
- return buff;
-}
-
-void HighRadix::print_buffer(Component *c)
-{
-// cout << "\tDelay - " << c->delay * 1e6 << " ns" << endl;
- cout << "\tDynamic Power - " << c->power.readOp.dynamic*1e9 << " nJ" << endl;
- cout << "\tLeakage Power - " << c->power.readOp.leakage*1e3 << " mW" << endl;
- cout << "\tWidth - " << c->area.w << " u" << endl;
- cout << "\tLength - " << c->area.h << " u" << endl;
-}
-
-
-void HighRadix::print_router()
-{
- cout << "\n\nMCPAT_Router stats:\n";
- cout << "\tNetwork frequency - " << FREQUENCY <<" GHz\n";
- cout << "\tNo. of Virtual channels - " << VC_COUNT << "\n";
- cout << "\tSub-switch size - " << (int)SUB_SWITCH_SZ << endl;
- cout << "\tNo. of rows - " << (int)ROWS << endl;
- cb->print_crossbar();
- out_cb->print_crossbar();
- vc_arb->print_arbiter();
- c_arb->print_arbiter();
- cb_arb->print_arbiter();
-// hor_bus->print_wire();
- cout << "\n\nBuffer stats:\n";
- cout << "\nInput Buffer stats:\n";
- print_buffer (inp_buff);
- cout << "\nRow Buffer stats:\n";
- print_buffer (r_buff);
- cout << "\nColumn Buffer stats:\n";
- print_buffer (c_buff);
-
-
- cout << "\n\n MCPAT_Router dynamic power (max) = " << power.readOp.dynamic * FREQUENCY * 1e9 << " W\n";
- cout << " MCPAT_Router dynamic power (load - " << AF << ") = " << power.readOp.dynamic * FREQUENCY * 1e9 * AF << " W\n";
- cout << "\n\nDetailed Stats\n";
- cout << "--------------\n";
- cout << "Power dissipated in buses/wires - " << setprecision(3) <<
- wire_tot.power.readOp.dynamic * FREQUENCY * 1e9 << " W";
- cout << "\t" <<setiosflags(ios::fixed) << setprecision(2) <<
- (wire_tot.power.readOp.dynamic/power.readOp.dynamic)*100 << " %\n";
- cout << "Buffer power - " << buff_tot.power.readOp.dynamic *
- FREQUENCY * 1e9 << " W";
- cout << "\t" <<
- (buff_tot.power.readOp.dynamic/power.readOp.dynamic)*100 << " %\n";
- cout << "Crossbar power - " << crossbar_tot.power.readOp.dynamic *
- FREQUENCY * 1e9 << " W";
- cout << "\t" <<
- (crossbar_tot.power.readOp.dynamic/power.readOp.dynamic)*100 << " %\n";
- cout << "Arbiter power - " << arb_tot.power.readOp.dynamic *
- FREQUENCY * 1e9 << " W";
- cout << "\t" <<
- (arb_tot.power.readOp.dynamic/power.readOp.dynamic)*100 << " %\n";
- cout << "Sub-switch power (dynamic) - " << sub_sw.power.readOp.dynamic * num_sub *
- FREQUENCY * 1e9 << " W";
- cout << "\t" <<
- (sub_sw.power.readOp.dynamic * num_sub/power.readOp.dynamic)*100 << " %\n";
- cout << "Input buffer power (dynamic) - " << 2 * inp_buff->power.readOp.dynamic *
- RADIX * FREQUENCY * 1e9 << " W";
- cout << "\t" <<
- (2 * inp_buff->power.readOp.dynamic * RADIX/power.readOp.dynamic)*100 << " %\n";
- cout << "\nLeakage power\n";
- cout << "MCPAT_Router power - " << power.readOp.leakage << " W\n";
- cout << "Bus power - " <<setprecision(4) << wire_tot.power.readOp.leakage << " W\n";
- cout << "Buffer power - " << buff_tot.power.readOp.leakage << " W\n";
- cout << "Crossbar power - " << crossbar_tot.power.readOp.leakage << " W\n";
- cout << "Arbiter power - " << arb_tot.power.readOp.leakage << " W\n";
- cout << "Sub-switch power - " << sub_sw.power.readOp.leakage << " W" <<endl;
-
- cout << "\n\nArea Stats\n";
- cout << "Input buffer dimension (mm x mm)- " << inp_buff->area.get_h()*1e-3 << " x " << inp_buff->area.get_w()*1e-3 << endl;
- cout << "Row buffer (mm x mm) - " << r_buff->area.w*1e-3 << " x " << r_buff->area.h*1e-3 << endl;
- cout << "Col buffer (mm x mm) - " << c_buff->area.w*1e-3 << " x " << c_buff->area.h*1e-3 << endl;
- cout << "Crossbar area (mm x mm) - " << cb->area.w*1e-3 << " x " << cb->area.h*1e-3 << endl;
-// cout << "Wire hor area (nm x nm) - " << hor_bus->area.w*1e3 << " x " << hor_bus->area.h*1e3 << endl;
-// cout << "Wire ver area (nm x nm) - " << ver_bus->area.w*1e3 << " x " << ver_bus->area.h*1e3 << endl;
- cout << "Wire total - " << wire_tot.area.get_area()*1e-6 << " mm2\n";
- cout << "Crossbar total - " << crossbar_tot.area.get_area()*1e-6 << " mm2\n";
- cout << "Buff total - " << buff_tot.area.get_area()*1e-6 << " mm2\n";
- cout << "Subswitch - " << sub_sw.area.get_area()*1e-6 << " mm2\n";
- cout << "Subswitch total - " << sub_sw.area.get_area()*num_sub*1e-6 << " mm2\n";
-
- cout << "Total area - " << (wire_tot.area.get_area() + crossbar_tot.area.get_area() +
- buff_tot.area.get_area())*1e-6 << endl;
-}
-