Skip to content

Commit 7e030ad

Browse files
committed
allow using perf for additional fixed counter configs
1 parent 1174197 commit 7e030ad

File tree

1 file changed

+38
-26
lines changed

1 file changed

+38
-26
lines changed

src/cpucounters.cpp

Lines changed: 38 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2496,12 +2496,12 @@ PCM::ErrorCode PCM::program(const PCM::ProgramMode mode_, const void * parameter
24962496
canUsePerf = false;
24972497
if (!silent) std::cerr << "Can not use Linux perf because your Linux kernel does not support PERF_COUNT_HW_REF_CPU_CYCLES event. Falling-back to direct PMU programming.\n";
24982498
}
2499-
else if(EXT_CUSTOM_CORE_EVENTS == mode_ && pExtDesc && pExtDesc->fixedCfg && pExtDesc->fixedCfg->value != 0x333)
2499+
else if(EXT_CUSTOM_CORE_EVENTS == mode_ && pExtDesc && pExtDesc->fixedCfg && (pExtDesc->fixedCfg->value & 0x444))
25002500
{
25012501
canUsePerf = false;
25022502
if (!silent)
25032503
{
2504-
std::cerr << "Can not use Linux perf because non-standard fixed counter configuration requested (0x" << std::hex << pExtDesc->fixedCfg->value
2504+
std::cerr << "Can not use Linux perf because \"any_thread\" fixed counter configuration requested (0x" << std::hex << pExtDesc->fixedCfg->value
25052505
<< std::dec << ") =\n" << *(pExtDesc->fixedCfg) << "\nFalling-back to direct PMU programming.\n\n";
25062506
}
25072507
}
@@ -2978,6 +2978,31 @@ PCM::ErrorCode PCM::programCoreCounters(const int i /* core */,
29782978

29792979
result.clear();
29802980
FixedEventControlRegister ctrl_reg;
2981+
auto initFixedCtrl = [&](const bool & enableCtr3)
2982+
{
2983+
if (EXT_CUSTOM_CORE_EVENTS == mode_ && pExtDesc && pExtDesc->fixedCfg)
2984+
{
2985+
ctrl_reg = *(pExtDesc->fixedCfg);
2986+
}
2987+
else
2988+
{
2989+
ctrl_reg.value = 0;
2990+
ctrl_reg.fields.os0 = 1;
2991+
ctrl_reg.fields.usr0 = 1;
2992+
2993+
ctrl_reg.fields.os1 = 1;
2994+
ctrl_reg.fields.usr1 = 1;
2995+
2996+
ctrl_reg.fields.os2 = 1;
2997+
ctrl_reg.fields.usr2 = 1;
2998+
2999+
if (enableCtr3 && isFixedCounterSupported(3))
3000+
{
3001+
ctrl_reg.fields.os3 = 1;
3002+
ctrl_reg.fields.usr3 = 1;
3003+
}
3004+
}
3005+
};
29813006
#ifdef PCM_USE_PERF
29823007
int leader_counter = -1;
29833008
auto programPerfEvent = [this, &leader_counter, &i](perf_event_attr & e, const int eventPos, const std::string & eventName) -> bool
@@ -3004,20 +3029,30 @@ PCM::ErrorCode PCM::programCoreCounters(const int i /* core */,
30043029
};
30053030
if (canUsePerf)
30063031
{
3032+
initFixedCtrl(false);
30073033
perf_event_attr e = PCM_init_perf_event_attr();
30083034
e.type = PERF_TYPE_HARDWARE;
30093035
e.config = PERF_COUNT_HW_INSTRUCTIONS;
3036+
e.exclude_kernel = 1 - ctrl_reg.fields.os0;
3037+
e.exclude_hv = e.exclude_kernel;
3038+
e.exclude_user = 1 - ctrl_reg.fields.usr0;
30103039
if (programPerfEvent(e, PERF_INST_RETIRED_POS, "INST_RETIRED") == false)
30113040
{
30123041
return PCM::UnknownError;
30133042
}
30143043
leader_counter = perfEventHandle[i][PERF_INST_RETIRED_POS];
30153044
e.config = PERF_COUNT_HW_CPU_CYCLES;
3045+
e.exclude_kernel = 1 - ctrl_reg.fields.os1;
3046+
e.exclude_hv = e.exclude_kernel;
3047+
e.exclude_user = 1 - ctrl_reg.fields.usr1;
30163048
if (programPerfEvent(e, PERF_CPU_CLK_UNHALTED_THREAD_POS, "CPU_CLK_UNHALTED_THREAD") == false)
30173049
{
30183050
return PCM::UnknownError;
30193051
}
30203052
e.config = PCM_PERF_COUNT_HW_REF_CPU_CYCLES;
3053+
e.exclude_kernel = 1 - ctrl_reg.fields.os2;
3054+
e.exclude_hv = e.exclude_kernel;
3055+
e.exclude_user = 1 - ctrl_reg.fields.usr2;
30213056
if (programPerfEvent(e, PERF_CPU_CLK_UNHALTED_REF_POS, "CPU_CLK_UNHALTED_REF") == false)
30223057
{
30233058
return PCM::UnknownError;
@@ -3030,30 +3065,7 @@ PCM::ErrorCode PCM::programCoreCounters(const int i /* core */,
30303065
MSR[i]->write(IA32_CR_PERF_GLOBAL_CTRL, 0);
30313066
MSR[i]->read(IA32_CR_FIXED_CTR_CTRL, &ctrl_reg.value);
30323067

3033-
3034-
if (EXT_CUSTOM_CORE_EVENTS == mode_ && pExtDesc && pExtDesc->fixedCfg)
3035-
{
3036-
ctrl_reg = *(pExtDesc->fixedCfg);
3037-
}
3038-
else
3039-
{
3040-
ctrl_reg.value = 0;
3041-
3042-
ctrl_reg.fields.os0 = 1;
3043-
ctrl_reg.fields.usr0 = 1;
3044-
3045-
ctrl_reg.fields.os1 = 1;
3046-
ctrl_reg.fields.usr1 = 1;
3047-
3048-
ctrl_reg.fields.os2 = 1;
3049-
ctrl_reg.fields.usr2 = 1;
3050-
3051-
if (isFixedCounterSupported(3))
3052-
{
3053-
ctrl_reg.fields.os3 = 1;
3054-
ctrl_reg.fields.usr3 = 1;
3055-
}
3056-
}
3068+
initFixedCtrl(true);
30573069

30583070
MSR[i]->write(INST_RETIRED_ADDR, 0);
30593071
MSR[i]->write(CPU_CLK_UNHALTED_THREAD_ADDR, 0);

0 commit comments

Comments
 (0)