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