From 0b0fa2ec1c98b9ad1cb5622c09704b8863b130aa Mon Sep 17 00:00:00 2001 From: Tayler Hetherington Date: Mon, 3 Jun 2013 10:48:07 -0800 Subject: Fixing 2 bugs & small code clean up: 1: 'Constant dynamic' power not included in average/min/max power values. 2: Average/min/max per-kernel powers not being reset at kernel boundaries, causing incorrect per-kernel values. [git-p4: depot-paths = "//depot/gpgpu_sim_research/fermi/distribution/": change = 16405] --- src/gpuwattch/gpgpu_sim_wrapper.cc | 52 +++++++++++++++++++++++++------------- 1 file changed, 34 insertions(+), 18 deletions(-) (limited to 'src/gpuwattch/gpgpu_sim_wrapper.cc') diff --git a/src/gpuwattch/gpgpu_sim_wrapper.cc b/src/gpuwattch/gpgpu_sim_wrapper.cc index a906231..0f534b9 100644 --- a/src/gpuwattch/gpgpu_sim_wrapper.cc +++ b/src/gpuwattch/gpgpu_sim_wrapper.cc @@ -66,9 +66,10 @@ gpgpu_sim_wrapper::gpgpu_sim_wrapper( bool power_simulation_enabled, char* xmlfi gpu_avg_power=0; gpu_tot_avg_power=0; - gpu_max_power=0; gpu_tot_max_power=0; + gpu_min_power=0; + gpu_tot_min_power=0; num_pwr_cmps=NUM_COMPONENTS_MODELLED; num_per_counts=NUM_PERFORMANCE_COUNTERS; @@ -84,8 +85,6 @@ gpgpu_sim_wrapper::gpgpu_sim_wrapper( bool power_simulation_enabled, char* xmlfi pwr_cmp_min=(double *)calloc(num_pwr_cmps,sizeof(double)); pwr_cmp_max=(double *)calloc(num_pwr_cmps,sizeof(double)); const_dynamic_power=0; - gpu_min_power=0; - gpu_tot_min_power=0; proc_power=0; g_power_filename = NULL; @@ -256,7 +255,14 @@ void gpgpu_sim_wrapper::reset_counters(bool do_print){ for(unsigned i=0; irt_power.readOp.dynamic); + + double total_power = proc->rt_power.readOp.dynamic + pwr_cmp[CONST_DYNAMICP]; + + // Average power + // Previous + new + constant dynamic power (e.g., dynamic clocking power) + gpu_avg_power += total_power; for(unsigned ind=0; indrt_power.readOp.dynamic>gpu_max_power){ - gpu_max_power=proc->rt_power.readOp.dynamic; + // Max Power + if(total_power > gpu_max_power){ + gpu_max_power = total_power; for(unsigned ind=0; indrt_power.readOp.dynamicrt_power.readOp.dynamic; + + // Min Power + if(total_power < gpu_min_power ||(gpu_min_power==0) ){ + gpu_min_power = total_power; for(unsigned ind=0; indrt_power.readOp.dynamic); - gpu_tot_max_power=(proc->rt_power.readOp.dynamic>gpu_tot_max_power)? proc->rt_power.readOp.dynamic:gpu_tot_max_power; - gpu_tot_min_power=((proc->rt_power.readOp.dynamicrt_power.readOp.dynamic:gpu_tot_min_power; + gpu_tot_avg_power = (gpu_tot_avg_power + total_power); + gpu_tot_max_power = (total_power > gpu_tot_max_power) ? total_power : gpu_tot_max_power; + gpu_tot_min_power = ((total_power < gpu_tot_min_power) || (gpu_tot_min_power == 0)) ? total_power : gpu_tot_min_power; } @@ -601,10 +613,14 @@ void gpgpu_sim_wrapper::update_components_power() pwr_cmp[IDLE_COREP]=proc->cores[0]->IdleCoreEnergy/(proc->cores[0]->executionTime); - //this constant dynamic part is estimated via regression model + // This constant dynamic power (e.g., clock power) part is estimated via regression model. pwr_cmp[CONST_DYNAMICP]=0; - pwr_cmp[CONST_DYNAMICP]=p->sys.scaling_coefficients[CONST_DYNAMICN]-proc->get_const_dynamic_power()/(proc->cores[0]->executionTime); - pwr_cmp[CONST_DYNAMICP]= (pwr_cmp[CONST_DYNAMICP]>0)? pwr_cmp[CONST_DYNAMICP]:0; + double cnst_dyn = proc->get_const_dynamic_power()/(proc->cores[0]->executionTime); + // If the regression scaling term is greater than the recorded constant dynamic power + // then use the difference (other portion already added to dynamic power). Else, + // all the constant dynamic power is accounted for, add nothing. + if(p->sys.scaling_coefficients[CONST_DYNAMICN] > cnst_dyn) + pwr_cmp[CONST_DYNAMICP] = (p->sys.scaling_coefficients[CONST_DYNAMICN]-cnst_dyn); proc_power+=pwr_cmp[CONST_DYNAMICP]; @@ -626,7 +642,7 @@ void gpgpu_sim_wrapper::print_power_kernel_stats(double gpu_sim_cycle, double gp { detect_print_steady_state(1,init_value); if(g_power_simulation_enabled){ - powerfile<