summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTayler Hetherington <[email protected]>2013-06-03 10:48:07 -0800
committerAndrew Boktor <[email protected]>2014-08-14 13:50:47 -0700
commit0b0fa2ec1c98b9ad1cb5622c09704b8863b130aa (patch)
tree7ba6e2dcd27738789c6ff4bb85cc039fc2407590
parenta223bc92293cf4c8d0e45ca6f15acdc571755ee5 (diff)
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]
-rw-r--r--CHANGES4
-rw-r--r--src/gpuwattch/gpgpu_sim_wrapper.cc52
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; i<num_per_counts; ++i){
perf_count_max[i]= 0;
}
- count=0;
+
+ // Reset per-kernel counters
+ count = 0;
+ gpu_avg_power = 0;
+ gpu_max_power = 0;
+ gpu_min_power = 0;
+
+
return;
}
@@ -413,7 +419,12 @@ void gpgpu_sim_wrapper::power_metrics_calculations()
{
gcount++;
count++;
- gpu_avg_power=(gpu_avg_power+ proc->rt_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; ind<num_pwr_cmps; ++ind){
pwr_cmp_avg[ind] += (double)pwr_cmp[ind];
}
@@ -422,10 +433,9 @@ void gpgpu_sim_wrapper::power_metrics_calculations()
perf_count_avg[ind] += (double)perf_count[ind];
}
-
-
- if(proc->rt_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; ind<num_pwr_cmps; ++ind){
pwr_cmp_max[ind] = (double)pwr_cmp[ind];
}
@@ -434,8 +444,10 @@ void gpgpu_sim_wrapper::power_metrics_calculations()
}
}
- if(proc->rt_power.readOp.dynamic<gpu_min_power ||(gpu_min_power==0) ){
- gpu_min_power=proc->rt_power.readOp.dynamic;
+
+ // Min Power
+ if(total_power < gpu_min_power ||(gpu_min_power==0) ){
+ gpu_min_power = total_power;
for(unsigned ind=0; ind<num_pwr_cmps; ++ind){
pwr_cmp_min[ind] = (double)pwr_cmp[ind];
}
@@ -444,9 +456,9 @@ void gpgpu_sim_wrapper::power_metrics_calculations()
}
}
- gpu_tot_avg_power=(gpu_tot_avg_power+ proc->rt_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.dynamic<gpu_tot_min_power)||(gpu_tot_min_power==0))? proc->rt_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<<kernel_info_string<<std::endl;
+ powerfile<<kernel_info_string<<std::endl;
powerfile<<"Kernel Average Power Data:"<<std::endl;
powerfile<<"gpu_avg_power = "<< gpu_avg_power/ count<<std::endl;