Существует хак для поддержки cycles:p
на SandyBridge, который не имеет PEBS для CPU_CLK_UNHALTED.*
. Взлом реализован в части ядра perf
в intel_pebs_aliases_snb()
. Когда пользователь запрашивает -e cycles
, который PERF_COUNT_HW_CPU_CYCLES
(переводит к CPU_CLK_UNHALTED.CORE
) с отличным от нуля precise
модификатора, эта функция изменит аппаратное событие UOPS_RETIRED.ALL
с УИБАМИ:
29 [PERF_COUNT_HW_CPU_CYCLES] = 0x003c,
2739 static void intel_pebs_aliases_snb(struct perf_event *event)
2740 {
2741 if ((event->hw.config & X86_RAW_EVENT_MASK) == 0x003c) {
2742 /*
2743 * Use an alternative encoding for CPU_CLK_UNHALTED.THREAD_P
2744 * (0x003c) so that we can use it with PEBS.
2745 *
2746 * The regular CPU_CLK_UNHALTED.THREAD_P event (0x003c) isn't
2747 * PEBS capable. However we can use UOPS_RETIRED.ALL
2748 * (0x01c2), which is a PEBS capable event, to get the same
2749 * count.
2750 *
2751 * UOPS_RETIRED.ALL counts the number of cycles that retires
2752 * CNTMASK micro-ops. By setting CNTMASK to a value (16)
2753 * larger than the maximum number of micro-ops that can be
2754 * retired per cycle (4) and then inverting the condition, we
2755 * count all cycles that retire 16 or less micro-ops, which
2756 * is every cycle.
2757 *
2758 * Thereby we gain a PEBS capable cycle counter.
2759 */
2760 u64 alt_config = X86_CONFIG(.event=0xc2, .umask=0x01, .inv=1, .cmask=16);
2761
2762 alt_config |= (event->hw.config & ~X86_RAW_EVENT_MASK);
2763 event->hw.config = alt_config;
2764 }
2765 }
intel_pebs_aliases_snb
обходным зарегистрирован в 3557 __init int intel_pmu_init(void)
для case INTEL_FAM6_SANDYBRIDGE:
/case INTEL_FAM6_SANDYBRIDGE_X:
, как
3772 x86_pmu.event_constraints = intel_snb_event_constraints;
3773 x86_pmu.pebs_constraints = intel_snb_pebs_event_constraints;
3774 x86_pmu.pebs_aliases = intel_pebs_aliases_snb;
pebs_aliases
Выбрано из intel_pmu_hw_config()
, если precise_ip
не имеет значение:
2814 static int intel_pmu_hw_config(struct perf_event *event)
2815 {
2821 if (event->attr.precise_ip) {
2828 if (x86_pmu.pebs_aliases)
2829 x86_pmu.pebs_aliases(event);
2830 }
Хак был реализован в 2012 году, lkml темы "[PATCH] перфорация, x86: Сделайте циклы: р работает над SNB", «[Совет: перфорация/ядро] перфорация/x86: Реализация циклов: р для SNB/IVB», cccb9ba9e4ee0d750265f53de9258df69655c40b, http://git.kernel.org/cgit/linux/kernel/git/tip/tip.git/commit/?id=cccb9ba9e4ee0d750265f53de9258df69655c40b:
Perf/x86: Реализовать циклы: р для SNB/IVB
Теперь, когда есть, наконец, чип с рабочим УИБ (Ivybridge), мы можем включить аппаратное обеспечение и реализовать циклы: p для SNB/IVB.
И я думаю, что нет полного списка такого «точного» превращающего хака помимо исходного линукса кода в arch/x86/events/intel/core.c
, Grep для static void intel_pebs_aliases
(обычно cycles:p
/CPU_CLK_UNHALTED 0x003c
реализована) и проверьте intel_pmu_init
для конкретной модели и точной x86_pmu.pebs_aliases
вариант выбран:
- intel_pebs_aliases_core2,
INST_RETIRED.ANY_P (0x00c0) CNTMASK=16
вместо cycles:p
- intel_pebs_aliases_snb,
UOPS_RETIRED.ALL (0x01c2) CNTMASK=16
вместо cycles:p
- intel_pebs_aliases_precdist для высоких значений
precise_ip
, INST_RETIRED.PREC_DIST (0x01c0)
вместо cycles:ppp
на СКЛ, IVB, HSW, BDW
Илья, попробуйте [ocperf из ПМУ-инструментов корпорации Intel] (https://github.com/andikleen/ ПМУ-инструменты). Он имеет полный список событий для процессоров Intel ('ocperf list'?), А vanilla perf не имеет полного списка в пользовательском пространстве. Сообщает ли перфектный отчет с заголовком также отличную от нуля точную_точку (это может потребоваться по записи, но отключено ядром)? Какая у вас версия ядра? ['exact_ip' из 1 -« SAMPLE_IP должен иметь постоянный скид »] (http://lxr.free-electrons.com/source/include/uapi/linux/perf_event.h?v=4.8#L323) – osgx