2017-02-10 5 views
3

Я хочу понять, какие события могут иметь точный модификатор на моем CPU (Sandy Bridge).Какие персидские события могут использовать PEBS?

Intel Software Developer Руководство (. Таблица 18-32 УИБ Производительность События для Intel микроархитектуры Код Название Sandy Bridge) содержит только следующие события: INST_RETIRED, UOPS_RETIRED, BR_INST_RETIRED, BR_MISP_RETIRED, MEM_UOPS_RETIRED, MEM_LOAD_UOPS_RETIRED, MEM_LOAD_UOPS_LLC_HIT_RETIRED. И SandyBridge_core_V15.json перечислена один и то же событие с УИБОМ> 0.

Однако есть some examples использования perf, которые добавляют :p к cycles событию. И я могу успешно запустить perf record -e cycles:p на моей машине.

Также perf record -e cycles:p -vv -- sleep 1 отпечатки precise_ip 1. Так значит ли это, что событие CPU_CLK_UNHALTED действительно использует PEBS?

Можно ли получить полный список событий, поддерживающих :p?

+0

Илья, попробуйте [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

ответ

2

Существует хак для поддержки 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
+0

Эксперимент с' perf stat -e циклы, циклы: p, инструкции, часы задач./program' показывают, что 'циклы' не равны« циклам: p », когда используется хак. Но разница составляет менее 0,1%. – osgx

Смежные вопросы