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] --- CHANGES | 4 +++ src/gpuwattch/gpgpu_sim_wrapper.cc | 52 +++++++++++++++++++++++++------------- 2 files changed, 38 insertions(+), 18 deletions(-) diff --git a/CHANGES b/CHANGES index 7b40c42..6689b62 100644 --- a/CHANGES +++ b/CHANGES @@ -29,6 +29,10 @@ Version 3.2.1+edits (development branch) versus 3.2.1 - Removed the use of gcc in compilation and the need for a bunch of unnecessary 'extern "c"' statements. - Fixed a mismatched new[] delete[] + - 'Constant dynamic' power not included in average/min/max power values. + - Average/min/max per-kernel powers not being reset at kernel boundaries causing + incorrect per-kernel values. + Version 3.2.1 versus 3.2.0 - Added kernel name and launch uids to performance statistics log. - Added l2_cache_config class to extend baseline cache_config. Allows for 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<