tools/power turbostat: simplify Bzy_MHz calculation
Bzy_MHz = TSC_delta*tsc_tweak/APERF_delta/MPERF_delta/measurement_interval becomes Bzy_MHz = base_mhz/APERF_delta/MPERF_delta on systems which support MSR_NHM_PLATFORM_INFO. base_mhz is calculated directly from the base_ratio reported in MSR_NHM_PLATFORM_INFO * bclk, and bclk is discovered via MSR or cpuid. This reduces the dependency of Bzy_MHz calculation on the TSC. Previously, there were 4 TSC readings required in each caculation, the raw TSC delta combined with the measurement_interval. This also removes the "tsc_tweak" correction factor used when TSC runs on a different base clock from the CPU's bclk. After this change, tsc_tweak is used only for %Busy. The end-result should be a Bzy_MHz result slightly less prone to jitter. Signed-off-by: Len Brown <len.brown@intel.com>
This commit is contained in:
parent
7379047d55
commit
21ed5574d1
1 changed files with 17 additions and 11 deletions
|
@ -75,6 +75,7 @@ unsigned int aperf_mperf_multiplier = 1;
|
||||||
int do_smi;
|
int do_smi;
|
||||||
double bclk;
|
double bclk;
|
||||||
double base_hz;
|
double base_hz;
|
||||||
|
unsigned int has_base_hz;
|
||||||
double tsc_tweak = 1.0;
|
double tsc_tweak = 1.0;
|
||||||
unsigned int show_pkg;
|
unsigned int show_pkg;
|
||||||
unsigned int show_core;
|
unsigned int show_core;
|
||||||
|
@ -96,6 +97,7 @@ unsigned int do_ring_perf_limit_reasons;
|
||||||
unsigned int crystal_hz;
|
unsigned int crystal_hz;
|
||||||
unsigned long long tsc_hz;
|
unsigned long long tsc_hz;
|
||||||
int base_cpu;
|
int base_cpu;
|
||||||
|
double discover_bclk(unsigned int family, unsigned int model);
|
||||||
|
|
||||||
#define RAPL_PKG (1 << 0)
|
#define RAPL_PKG (1 << 0)
|
||||||
/* 0x610 MSR_PKG_POWER_LIMIT */
|
/* 0x610 MSR_PKG_POWER_LIMIT */
|
||||||
|
@ -511,9 +513,13 @@ int format_counters(struct thread_data *t, struct core_data *c,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Bzy_MHz */
|
/* Bzy_MHz */
|
||||||
if (has_aperf)
|
if (has_aperf) {
|
||||||
|
if (has_base_hz)
|
||||||
|
outp += sprintf(outp, "%8.0f", base_hz / units * t->aperf / t->mperf);
|
||||||
|
else
|
||||||
outp += sprintf(outp, "%8.0f",
|
outp += sprintf(outp, "%8.0f",
|
||||||
1.0 * t->tsc * tsc_tweak / units * t->aperf / t->mperf / interval_float);
|
1.0 * t->tsc / units * t->aperf / t->mperf / interval_float);
|
||||||
|
}
|
||||||
|
|
||||||
/* TSC_MHz */
|
/* TSC_MHz */
|
||||||
outp += sprintf(outp, "%8.0f", 1.0 * t->tsc/units/interval_float);
|
outp += sprintf(outp, "%8.0f", 1.0 * t->tsc/units/interval_float);
|
||||||
|
@ -1158,12 +1164,6 @@ int phi_pkg_cstate_limits[16] = {PCL__0, PCL__2, PCL_6N, PCL_6R, PCLRSV, PCLRSV,
|
||||||
static void
|
static void
|
||||||
calculate_tsc_tweak()
|
calculate_tsc_tweak()
|
||||||
{
|
{
|
||||||
unsigned long long msr;
|
|
||||||
unsigned int base_ratio;
|
|
||||||
|
|
||||||
get_msr(base_cpu, MSR_NHM_PLATFORM_INFO, &msr);
|
|
||||||
base_ratio = (msr >> 8) & 0xFF;
|
|
||||||
base_hz = base_ratio * bclk * 1000000;
|
|
||||||
tsc_tweak = base_hz / tsc_hz;
|
tsc_tweak = base_hz / tsc_hz;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1821,6 +1821,7 @@ void check_permissions()
|
||||||
int probe_nhm_msrs(unsigned int family, unsigned int model)
|
int probe_nhm_msrs(unsigned int family, unsigned int model)
|
||||||
{
|
{
|
||||||
unsigned long long msr;
|
unsigned long long msr;
|
||||||
|
unsigned int base_ratio;
|
||||||
int *pkg_cstate_limits;
|
int *pkg_cstate_limits;
|
||||||
|
|
||||||
if (!genuine_intel)
|
if (!genuine_intel)
|
||||||
|
@ -1829,6 +1830,8 @@ int probe_nhm_msrs(unsigned int family, unsigned int model)
|
||||||
if (family != 6)
|
if (family != 6)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
bclk = discover_bclk(family, model);
|
||||||
|
|
||||||
switch (model) {
|
switch (model) {
|
||||||
case 0x1A: /* Core i7, Xeon 5500 series - Bloomfield, Gainstown NHM-EP */
|
case 0x1A: /* Core i7, Xeon 5500 series - Bloomfield, Gainstown NHM-EP */
|
||||||
case 0x1E: /* Core i7 and i5 Processor - Clarksfield, Lynnfield, Jasper Forest */
|
case 0x1E: /* Core i7 and i5 Processor - Clarksfield, Lynnfield, Jasper Forest */
|
||||||
|
@ -1871,9 +1874,13 @@ int probe_nhm_msrs(unsigned int family, unsigned int model)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
get_msr(base_cpu, MSR_NHM_SNB_PKG_CST_CFG_CTL, &msr);
|
get_msr(base_cpu, MSR_NHM_SNB_PKG_CST_CFG_CTL, &msr);
|
||||||
|
|
||||||
pkg_cstate_limit = pkg_cstate_limits[msr & 0xF];
|
pkg_cstate_limit = pkg_cstate_limits[msr & 0xF];
|
||||||
|
|
||||||
|
get_msr(base_cpu, MSR_NHM_PLATFORM_INFO, &msr);
|
||||||
|
base_ratio = (msr >> 8) & 0xFF;
|
||||||
|
|
||||||
|
base_hz = base_ratio * bclk * 1000000;
|
||||||
|
has_base_hz = 1;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
int has_nhm_turbo_ratio_limit(unsigned int family, unsigned int model)
|
int has_nhm_turbo_ratio_limit(unsigned int family, unsigned int model)
|
||||||
|
@ -2780,7 +2787,6 @@ void process_cpuid()
|
||||||
do_skl_residency = has_skl_msrs(family, model);
|
do_skl_residency = has_skl_msrs(family, model);
|
||||||
do_slm_cstates = is_slm(family, model);
|
do_slm_cstates = is_slm(family, model);
|
||||||
do_knl_cstates = is_knl(family, model);
|
do_knl_cstates = is_knl(family, model);
|
||||||
bclk = discover_bclk(family, model);
|
|
||||||
|
|
||||||
rapl_probe(family, model);
|
rapl_probe(family, model);
|
||||||
perf_limit_reasons_probe(family, model);
|
perf_limit_reasons_probe(family, model);
|
||||||
|
|
Loading…
Add table
Reference in a new issue