void UncoreCounterState::readAndAggregate(MsrHandle * msr)
{
TemporalThreadAffinity tempThreadAffinity(msr->getCoreId()); // speedup trick for Linux
PCM * m = PCM::getInstance();
uint32 cpu_model = m->getCPUModel();
switch (cpu_model)
{
case PCM::WESTMERE_EP:
case PCM::NEHALEM_EP:
{
uint64 cUncMCFullWrites = 0;
uint64 cUncMCNormalReads = 0;
msr->read(MSR_UNCORE_PMC0, &cUncMCFullWrites);
msr->read(MSR_UNCORE_PMC1, &cUncMCNormalReads);
UncMCFullWrites += m->extractUncoreGenCounterValue(cUncMCFullWrites);
UncMCNormalReads += m->extractUncoreGenCounterValue(cUncMCNormalReads);
}
break;
case PCM::NEHALEM_EX:
case PCM::WESTMERE_EX:
{
uint64 cUncMCNormalReads = 0;
msr->read(MB0_MSR_PMU_CNT_0, &cUncMCNormalReads);
UncMCNormalReads += m->extractUncoreGenCounterValue(cUncMCNormalReads);
msr->read(MB1_MSR_PMU_CNT_0, &cUncMCNormalReads);
UncMCNormalReads += m->extractUncoreGenCounterValue(cUncMCNormalReads);
uint64 cUncMCFullWrites = 0; // really good approximation of
msr->read(BB0_MSR_PERF_CNT_1, &cUncMCFullWrites);
UncMCFullWrites += m->extractUncoreGenCounterValue(cUncMCFullWrites);
msr->read(BB1_MSR_PERF_CNT_1, &cUncMCFullWrites);
UncMCFullWrites += m->extractUncoreGenCounterValue(cUncMCFullWrites);
}
break;
case PCM::JAKETOWN:
case PCM::SANDY_BRIDGE:
case PCM::IVY_BRIDGE:
{
}
break;
default:;
}
uint64 cC2Residency = 0;
uint64 cC3Residency = 0;
uint64 cC6Residency = 0;
uint64 cC7Residency = 0;
msr->read(MSR_PKG_C3_RESIDENCY, &cC3Residency);
msr->read(MSR_PKG_C6_RESIDENCY, &cC6Residency);
if(m->extendedCStateMetricsAvailable())
{
msr->read(MSR_PKG_C2_RESIDENCY, &cC2Residency);
msr->read(MSR_PKG_C7_RESIDENCY, &cC7Residency);
}
C2Residency += cC2Residency;
C3Residency += cC3Residency;
C6Residency += cC6Residency;
C7Residency += cC7Residency;
}