array.cc revision 10152
110152Satgutier@umich.edu/*****************************************************************************
210152Satgutier@umich.edu *                                McPAT
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#define  GLOBALVAR
3310152Satgutier@umich.edu#include <cassert>
3410152Satgutier@umich.edu#include <cmath>
3510152Satgutier@umich.edu#include <iostream>
3610152Satgutier@umich.edu
3710152Satgutier@umich.edu#include "area.h"
3810152Satgutier@umich.edu#include "array.h"
3910152Satgutier@umich.edu#include "decoder.h"
4010152Satgutier@umich.edu#include "globalvar.h"
4110152Satgutier@umich.edu#include "parameter.h"
4210152Satgutier@umich.edu
4310152Satgutier@umich.eduusing namespace std;
4410152Satgutier@umich.edu
4510152Satgutier@umich.eduArrayST::ArrayST(const InputParameter *configure_interface,
4610152Satgutier@umich.edu                               string _name,
4710152Satgutier@umich.edu                               enum Device_ty device_ty_,
4810152Satgutier@umich.edu                               bool opt_local_,
4910152Satgutier@umich.edu                               enum Core_type core_ty_,
5010152Satgutier@umich.edu                               bool _is_default)
5110152Satgutier@umich.edu:l_ip(*configure_interface),
5210152Satgutier@umich.edu name(_name),
5310152Satgutier@umich.edu device_ty(device_ty_),
5410152Satgutier@umich.edu opt_local(opt_local_),
5510152Satgutier@umich.edu core_ty(core_ty_),
5610152Satgutier@umich.edu is_default(_is_default)
5710152Satgutier@umich.edu    {
5810152Satgutier@umich.edu
5910152Satgutier@umich.edu        if (l_ip.cache_sz<64) l_ip.cache_sz=64;
6010152Satgutier@umich.edu        l_ip.error_checking();//not only do the error checking but also fill some missing parameters
6110152Satgutier@umich.edu        optimize_array();
6210152Satgutier@umich.edu
6310152Satgutier@umich.edu}
6410152Satgutier@umich.edu
6510152Satgutier@umich.edu
6610152Satgutier@umich.eduvoid ArrayST::compute_base_power()
6710152Satgutier@umich.edu    {
6810152Satgutier@umich.edu        //l_ip.out_w               =l_ip.line_sz*8;
6910152Satgutier@umich.edu    local_result=cacti_interface(&l_ip);
7010152Satgutier@umich.edu
7110152Satgutier@umich.edu    }
7210152Satgutier@umich.edu
7310152Satgutier@umich.eduvoid ArrayST::optimize_array()
7410152Satgutier@umich.edu{
7510152Satgutier@umich.edu        list<uca_org_t > candidate_solutions(0);
7610152Satgutier@umich.edu        list<uca_org_t >::iterator candidate_iter, min_dynamic_energy_iter;
7710152Satgutier@umich.edu
7810152Satgutier@umich.edu        uca_org_t * temp_res = 0;
7910152Satgutier@umich.edu        local_result.valid=false;
8010152Satgutier@umich.edu
8110152Satgutier@umich.edu        double 	throughput=l_ip.throughput, latency=l_ip.latency;
8210152Satgutier@umich.edu        double  area_efficiency_threshold = 20.0;
8310152Satgutier@umich.edu        bool 	throughput_overflow=true, latency_overflow=true;
8410152Satgutier@umich.edu        compute_base_power();
8510152Satgutier@umich.edu
8610152Satgutier@umich.edu        if ((local_result.cycle_time - throughput) <= 1e-10 )
8710152Satgutier@umich.edu                throughput_overflow=false;
8810152Satgutier@umich.edu        if ((local_result.access_time - latency)<= 1e-10)
8910152Satgutier@umich.edu                latency_overflow=false;
9010152Satgutier@umich.edu
9110152Satgutier@umich.edu        if (opt_for_clk && opt_local)
9210152Satgutier@umich.edu        {
9310152Satgutier@umich.edu                if (throughput_overflow || latency_overflow)
9410152Satgutier@umich.edu                {
9510152Satgutier@umich.edu                        l_ip.ed=0;
9610152Satgutier@umich.edu
9710152Satgutier@umich.edu                        l_ip.delay_wt                = 100;//Fixed number, make sure timing can be satisfied.
9810152Satgutier@umich.edu                        l_ip.cycle_time_wt           = 1000;
9910152Satgutier@umich.edu
10010152Satgutier@umich.edu                        l_ip.area_wt                 = 10;//Fixed number, This is used to exhaustive search for individual components.
10110152Satgutier@umich.edu                        l_ip.dynamic_power_wt        = 10;//Fixed number, This is used to exhaustive search for individual components.
10210152Satgutier@umich.edu                        l_ip.leakage_power_wt        = 10;
10310152Satgutier@umich.edu
10410152Satgutier@umich.edu                        l_ip.delay_dev               = 1000000;//Fixed number, make sure timing can be satisfied.
10510152Satgutier@umich.edu                        l_ip.cycle_time_dev          = 100;
10610152Satgutier@umich.edu
10710152Satgutier@umich.edu                        l_ip.area_dev                = 1000000;//Fixed number, This is used to exhaustive search for individual components.
10810152Satgutier@umich.edu                        l_ip.dynamic_power_dev       = 1000000;//Fixed number, This is used to exhaustive search for individual components.
10910152Satgutier@umich.edu                        l_ip.leakage_power_dev       = 1000000;
11010152Satgutier@umich.edu
11110152Satgutier@umich.edu                        throughput_overflow=true; //Reset overflow flag before start optimization iterations
11210152Satgutier@umich.edu                        latency_overflow=true;
11310152Satgutier@umich.edu
11410152Satgutier@umich.edu                        temp_res = &local_result; //Clean up the result for optimized for ED^2P
11510152Satgutier@umich.edu                        temp_res->cleanup();
11610152Satgutier@umich.edu                }
11710152Satgutier@umich.edu
11810152Satgutier@umich.edu
11910152Satgutier@umich.edu                while ((throughput_overflow || latency_overflow)&&l_ip.cycle_time_dev > 10)// && l_ip.delay_dev > 10
12010152Satgutier@umich.edu                {
12110152Satgutier@umich.edu                        compute_base_power();
12210152Satgutier@umich.edu
12310152Satgutier@umich.edu                        l_ip.cycle_time_dev-=10;//This is the time_dev to be used for next iteration
12410152Satgutier@umich.edu
12510152Satgutier@umich.edu                        //		from best area to worst area -->worst timing to best timing
12610152Satgutier@umich.edu                        if ((((local_result.cycle_time - throughput) <= 1e-10 ) && (local_result.access_time - latency)<= 1e-10)||
12710152Satgutier@umich.edu                                        (local_result.data_array2->area_efficiency < area_efficiency_threshold && l_ip.assoc == 0))
12810152Satgutier@umich.edu                        {  //if no satisfiable solution is found,the most aggressive one is left
12910152Satgutier@umich.edu                                candidate_solutions.push_back(local_result);
13010152Satgutier@umich.edu                                //output_data_csv(candidate_solutions.back());
13110152Satgutier@umich.edu                                if (((local_result.cycle_time - throughput) <= 1e-10) && ((local_result.access_time - latency)<= 1e-10))
13210152Satgutier@umich.edu                                        //ensure stop opt not because of cam
13310152Satgutier@umich.edu                                {
13410152Satgutier@umich.edu                                        throughput_overflow=false;
13510152Satgutier@umich.edu                                        latency_overflow=false;
13610152Satgutier@umich.edu                                }
13710152Satgutier@umich.edu
13810152Satgutier@umich.edu                        }
13910152Satgutier@umich.edu                        else
14010152Satgutier@umich.edu                        {
14110152Satgutier@umich.edu                                //TODO: whether checking the partial satisfied results too, or just change the mark???
14210152Satgutier@umich.edu                                if ((local_result.cycle_time - throughput) <= 1e-10)
14310152Satgutier@umich.edu                                                                                throughput_overflow=false;
14410152Satgutier@umich.edu                                if ((local_result.access_time - latency)<= 1e-10)
14510152Satgutier@umich.edu                                                                                latency_overflow=false;
14610152Satgutier@umich.edu
14710152Satgutier@umich.edu                                if (l_ip.cycle_time_dev > 10)
14810152Satgutier@umich.edu                                {   //if not >10 local_result is the last result, it cannot be cleaned up
14910152Satgutier@umich.edu                                        temp_res = &local_result; //Only solutions not saved in the list need to be cleaned up
15010152Satgutier@umich.edu                                        temp_res->cleanup();
15110152Satgutier@umich.edu                                }
15210152Satgutier@umich.edu                        }
15310152Satgutier@umich.edu//			l_ip.cycle_time_dev-=10;
15410152Satgutier@umich.edu//			l_ip.delay_dev-=10;
15510152Satgutier@umich.edu
15610152Satgutier@umich.edu                }
15710152Satgutier@umich.edu
15810152Satgutier@umich.edu
15910152Satgutier@umich.edu        if (l_ip.assoc > 0)
16010152Satgutier@umich.edu        {
16110152Satgutier@umich.edu                //For array structures except CAM and FA, Give warning but still provide a result with best timing found
16210152Satgutier@umich.edu                if (throughput_overflow==true)
16310152Satgutier@umich.edu                        cout<< "Warning: " << name<<" array structure cannot satisfy throughput constraint." << endl;
16410152Satgutier@umich.edu                if (latency_overflow==true)
16510152Satgutier@umich.edu                        cout<< "Warning: " << name<<" array structure cannot satisfy latency constraint." << endl;
16610152Satgutier@umich.edu        }
16710152Satgutier@umich.edu
16810152Satgutier@umich.edu//	else
16910152Satgutier@umich.edu//	{
17010152Satgutier@umich.edu//		/*According to "Content-Addressable Memory (CAM) Circuits and
17110152Satgutier@umich.edu//				Architectures": A Tutorial and Survey
17210152Satgutier@umich.edu//				by Kostas Pagiamtzis et al.
17310152Satgutier@umich.edu//				CAM structures can be heavily pipelined and use look-ahead techniques,
17410152Satgutier@umich.edu//				therefore timing can be relaxed. But McPAT does not model the advanced
17510152Satgutier@umich.edu//				techniques. If continue optimizing, the area efficiency will be too low
17610152Satgutier@umich.edu//		*/
17710152Satgutier@umich.edu//		//For CAM and FA, stop opt if area efficiency is too low
17810152Satgutier@umich.edu//		if (throughput_overflow==true)
17910152Satgutier@umich.edu//			cout<< "Warning: " <<" McPAT stopped optimization on throughput for "<< name
18010152Satgutier@umich.edu//				<<" array structure because its area efficiency is below "<<area_efficiency_threshold<<"% " << endl;
18110152Satgutier@umich.edu//		if (latency_overflow==true)
18210152Satgutier@umich.edu//			cout<< "Warning: " <<" McPAT stopped optimization on latency for "<< name
18310152Satgutier@umich.edu//				<<" array structure because its area efficiency is below "<<area_efficiency_threshold<<"% " << endl;
18410152Satgutier@umich.edu//	}
18510152Satgutier@umich.edu
18610152Satgutier@umich.edu                //double min_dynamic_energy, min_dynamic_power, min_leakage_power, min_cycle_time;
18710152Satgutier@umich.edu                double min_dynamic_energy=BIGNUM;
18810152Satgutier@umich.edu                if (candidate_solutions.empty()==false)
18910152Satgutier@umich.edu                {
19010152Satgutier@umich.edu                        local_result.valid=true;
19110152Satgutier@umich.edu                        for (candidate_iter = candidate_solutions.begin(); candidate_iter != candidate_solutions.end(); ++candidate_iter)
19210152Satgutier@umich.edu
19310152Satgutier@umich.edu                        {
19410152Satgutier@umich.edu                                if (min_dynamic_energy > (candidate_iter)->power.readOp.dynamic)
19510152Satgutier@umich.edu                                {
19610152Satgutier@umich.edu                                        min_dynamic_energy = (candidate_iter)->power.readOp.dynamic;
19710152Satgutier@umich.edu                                        min_dynamic_energy_iter = candidate_iter;
19810152Satgutier@umich.edu                                        local_result = *(min_dynamic_energy_iter);
19910152Satgutier@umich.edu                                        //TODO: since results are reordered results and l_ip may miss match. Therefore, the final output spread sheets may show the miss match.
20010152Satgutier@umich.edu
20110152Satgutier@umich.edu                                }
20210152Satgutier@umich.edu                                else
20310152Satgutier@umich.edu                                {
20410152Satgutier@umich.edu                                        candidate_iter->cleanup() ;
20510152Satgutier@umich.edu                                }
20610152Satgutier@umich.edu
20710152Satgutier@umich.edu                        }
20810152Satgutier@umich.edu
20910152Satgutier@umich.edu
21010152Satgutier@umich.edu                }
21110152Satgutier@umich.edu        candidate_solutions.clear();
21210152Satgutier@umich.edu        }
21310152Satgutier@umich.edu
21410152Satgutier@umich.edu        double long_channel_device_reduction = longer_channel_device_reduction(device_ty,core_ty);
21510152Satgutier@umich.edu
21610152Satgutier@umich.edu        double macro_layout_overhead   = g_tp.macro_layout_overhead;
21710152Satgutier@umich.edu        double chip_PR_overhead        = g_tp.chip_layout_overhead;
21810152Satgutier@umich.edu        double total_overhead          = macro_layout_overhead*chip_PR_overhead;
21910152Satgutier@umich.edu        local_result.area *= total_overhead;
22010152Satgutier@umich.edu
22110152Satgutier@umich.edu        //maintain constant power density
22210152Satgutier@umich.edu        double pppm_t[4]    = {total_overhead,1,1,total_overhead};
22310152Satgutier@umich.edu
22410152Satgutier@umich.edu        double sckRation = g_tp.sckt_co_eff;
22510152Satgutier@umich.edu        local_result.power.readOp.dynamic *= sckRation;
22610152Satgutier@umich.edu        local_result.power.writeOp.dynamic *= sckRation;
22710152Satgutier@umich.edu        local_result.power.searchOp.dynamic *= sckRation;
22810152Satgutier@umich.edu        local_result.power.readOp.leakage *= l_ip.nbanks;
22910152Satgutier@umich.edu        local_result.power.readOp.longer_channel_leakage =
23010152Satgutier@umich.edu                local_result.power.readOp.leakage*long_channel_device_reduction;
23110152Satgutier@umich.edu        local_result.power = local_result.power* pppm_t;
23210152Satgutier@umich.edu
23310152Satgutier@umich.edu        local_result.data_array2->power.readOp.dynamic *= sckRation;
23410152Satgutier@umich.edu        local_result.data_array2->power.writeOp.dynamic *= sckRation;
23510152Satgutier@umich.edu        local_result.data_array2->power.searchOp.dynamic *= sckRation;
23610152Satgutier@umich.edu        local_result.data_array2->power.readOp.leakage *= l_ip.nbanks;
23710152Satgutier@umich.edu        local_result.data_array2->power.readOp.longer_channel_leakage =
23810152Satgutier@umich.edu                local_result.data_array2->power.readOp.leakage*long_channel_device_reduction;
23910152Satgutier@umich.edu        local_result.data_array2->power = local_result.data_array2->power* pppm_t;
24010152Satgutier@umich.edu
24110152Satgutier@umich.edu
24210152Satgutier@umich.edu        if (!(l_ip.pure_cam || l_ip.pure_ram || l_ip.fully_assoc) && l_ip.is_cache)
24310152Satgutier@umich.edu        {
24410152Satgutier@umich.edu                local_result.tag_array2->power.readOp.dynamic *= sckRation;
24510152Satgutier@umich.edu                local_result.tag_array2->power.writeOp.dynamic *= sckRation;
24610152Satgutier@umich.edu                local_result.tag_array2->power.searchOp.dynamic *= sckRation;
24710152Satgutier@umich.edu                local_result.tag_array2->power.readOp.leakage *= l_ip.nbanks;
24810152Satgutier@umich.edu                local_result.tag_array2->power.readOp.longer_channel_leakage =
24910152Satgutier@umich.edu                        local_result.tag_array2->power.readOp.leakage*long_channel_device_reduction;
25010152Satgutier@umich.edu                local_result.tag_array2->power = local_result.tag_array2->power* pppm_t;
25110152Satgutier@umich.edu        }
25210152Satgutier@umich.edu
25310152Satgutier@umich.edu
25410152Satgutier@umich.edu}
25510152Satgutier@umich.edu
25610152Satgutier@umich.eduvoid ArrayST::leakage_feedback(double temperature)
25710152Satgutier@umich.edu{
25810152Satgutier@umich.edu  // Update the temperature. l_ip is already set and error-checked in the creator function.
25910152Satgutier@umich.edu  l_ip.temp = (unsigned int)round(temperature/10.0)*10;
26010152Satgutier@umich.edu
26110152Satgutier@umich.edu  // This corresponds to cacti_interface() in the initialization process. Leakage power is updated here.
26210152Satgutier@umich.edu  reconfigure(&l_ip,&local_result);
26310152Satgutier@umich.edu
26410152Satgutier@umich.edu  // Scale the power values. This is part of ArrayST::optimize_array().
26510152Satgutier@umich.edu  double long_channel_device_reduction = longer_channel_device_reduction(device_ty,core_ty);
26610152Satgutier@umich.edu
26710152Satgutier@umich.edu  double macro_layout_overhead   = g_tp.macro_layout_overhead;
26810152Satgutier@umich.edu  double chip_PR_overhead        = g_tp.chip_layout_overhead;
26910152Satgutier@umich.edu  double total_overhead          = macro_layout_overhead*chip_PR_overhead;
27010152Satgutier@umich.edu
27110152Satgutier@umich.edu  double pppm_t[4]    = {total_overhead,1,1,total_overhead};
27210152Satgutier@umich.edu
27310152Satgutier@umich.edu  double sckRation = g_tp.sckt_co_eff;
27410152Satgutier@umich.edu  local_result.power.readOp.dynamic *= sckRation;
27510152Satgutier@umich.edu  local_result.power.writeOp.dynamic *= sckRation;
27610152Satgutier@umich.edu  local_result.power.searchOp.dynamic *= sckRation;
27710152Satgutier@umich.edu  local_result.power.readOp.leakage *= l_ip.nbanks;
27810152Satgutier@umich.edu  local_result.power.readOp.longer_channel_leakage = local_result.power.readOp.leakage*long_channel_device_reduction;
27910152Satgutier@umich.edu  local_result.power = local_result.power* pppm_t;
28010152Satgutier@umich.edu
28110152Satgutier@umich.edu  local_result.data_array2->power.readOp.dynamic *= sckRation;
28210152Satgutier@umich.edu  local_result.data_array2->power.writeOp.dynamic *= sckRation;
28310152Satgutier@umich.edu  local_result.data_array2->power.searchOp.dynamic *= sckRation;
28410152Satgutier@umich.edu  local_result.data_array2->power.readOp.leakage *= l_ip.nbanks;
28510152Satgutier@umich.edu  local_result.data_array2->power.readOp.longer_channel_leakage = local_result.data_array2->power.readOp.leakage*long_channel_device_reduction;
28610152Satgutier@umich.edu  local_result.data_array2->power = local_result.data_array2->power* pppm_t;
28710152Satgutier@umich.edu
28810152Satgutier@umich.edu  if (!(l_ip.pure_cam || l_ip.pure_ram || l_ip.fully_assoc) && l_ip.is_cache)
28910152Satgutier@umich.edu  {
29010152Satgutier@umich.edu    local_result.tag_array2->power.readOp.dynamic *= sckRation;
29110152Satgutier@umich.edu    local_result.tag_array2->power.writeOp.dynamic *= sckRation;
29210152Satgutier@umich.edu    local_result.tag_array2->power.searchOp.dynamic *= sckRation;
29310152Satgutier@umich.edu    local_result.tag_array2->power.readOp.leakage *= l_ip.nbanks;
29410152Satgutier@umich.edu    local_result.tag_array2->power.readOp.longer_channel_leakage = local_result.tag_array2->power.readOp.leakage*long_channel_device_reduction;
29510152Satgutier@umich.edu    local_result.tag_array2->power = local_result.tag_array2->power* pppm_t;
29610152Satgutier@umich.edu  }
29710152Satgutier@umich.edu}
29810152Satgutier@umich.edu
29910152Satgutier@umich.eduArrayST:: ~ArrayST()
30010152Satgutier@umich.edu{
30110152Satgutier@umich.edu        local_result.cleanup();
30210152Satgutier@umich.edu}
303