2016-04-01 2 views
3

Я установил perf на процессоре Haswell (Intel Core i7-4790). Но «первичный список» не включает «застопорившиеся циклы-фронтэнд» или «застопоренные циклы-бэкэнд». Я проверил http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html и не нашел событий производительности, связанных с резервными циклами, из таблицы 19-7 (не архитектурные события производительности в процессоре Core 4-го поколения Intel Core процессоры).В микроархитектуре Haswell нет фиксированных циклов-backend в perf

Итак, мой вопрос: как я могу измерить стоп-цикл-бэкэнд с использованием перфораторов или других инструментов в ядрах процессора Haswell. Ядро - 3,19, а первичная версия - 3,19.

Благодаря

+1

Пробовали ли вы [ 'ocperf.py'] (https://lwn.net/Articles/556983/)? Это оболочка с большим количеством имен событий, специфичных для hw. Работает ли 'perf stat' нормально? Он включает эти счетчики по умолчанию. –

+0

@PeterCordes Спасибо за ваш ответ, я попробовал ocperf, и я нашел так называемые «cycle_activity.cycles_no_execute», «uops_executed.stall_cycles» и «uops_retired.stall_cycles». Но я не уверен, что это «заторможенные циклы-бэкэнд». –

+0

hank wing, возможно, авторы отображения подсистемы 'perf_events' тоже были неуверены и просто не отображали этот (плохо спроектированный и названный)« stalled-cycles-backend »в какое-то одно событие на haswell? ([Код] (http://elixir.free-electrons.com/linux/v4.11/source/arch/x86/events/intel/core.c#L3856), существует сопоставление 'PERF_COUNT_HW_STALLED_CYCLES_BACKEND' для Westmere WSM, Sandy SNB, а не для Айви, Хасуэлла, Бродвелла и новее). Авторы [toplev.py] (https://github.com/andikleen/pmu-tools/blob/master/toplev.py) или PAPI могут отображать сложные события, они могут использовать формулы для вычисления их из нескольких. – osgx

ответ

1

Да, нет отображения «застопорились-циклы-интерфейс» и «Тупик-циклы-серверными» синтетических события в perf_events подсистеме в ядре для новых процессоров, таких как Ivy Bridge или Haswell. И нет сопоставления с более старым Core 2. Возможно, это название/концепция/идея не хороши для измененных и сложных микроархитектур современных процессоров Out-of-order без простого скалярного измерения глобального «Stall».

Кодекса is in arch/x86/events/intel/core.c и синтетические события имена PERF_COUNT_HW_STALLED_CYCLES_FRONTEND и PERF_COUNT_HW_STALLED_CYCLES_BACKEND:

__init int intel_pmu_init(void) 
{... 

Оба определяются так Nehalem, для Westmere, Sandy Bridge:

case INTEL_FAM6_NEHALEM: 
    case INTEL_FAM6_NEHALEM_EP: 
    case INTEL_FAM6_NEHALEM_EX: 

     /* UOPS_ISSUED.STALLED_CYCLES */ 
     intel_perfmon_event_map[PERF_COUNT_HW_STALLED_CYCLES_FRONTEND] = 
      X86_CONFIG(.event=0x0e, .umask=0x01, .inv=1, .cmask=1); 
     /* UOPS_EXECUTED.CORE_ACTIVE_CYCLES,c=1,i=1 */ 
     intel_perfmon_event_map[PERF_COUNT_HW_STALLED_CYCLES_BACKEND] = 
      X86_CONFIG(.event=0xb1, .umask=0x3f, .inv=1, .cmask=1); 

    case INTEL_FAM6_WESTMERE: 
    case INTEL_FAM6_WESTMERE_EP: 
    case INTEL_FAM6_WESTMERE_EX: 

     /* UOPS_ISSUED.STALLED_CYCLES */ 
     intel_perfmon_event_map[PERF_COUNT_HW_STALLED_CYCLES_FRONTEND] = 
      X86_CONFIG(.event=0x0e, .umask=0x01, .inv=1, .cmask=1); 
     /* UOPS_EXECUTED.CORE_ACTIVE_CYCLES,c=1,i=1 */ 
     intel_perfmon_event_map[PERF_COUNT_HW_STALLED_CYCLES_BACKEND] = 
      X86_CONFIG(.event=0xb1, .umask=0x3f, .inv=1, .cmask=1); 


    case INTEL_FAM6_SANDYBRIDGE: 
    case INTEL_FAM6_SANDYBRIDGE_X: 


     /* UOPS_ISSUED.ANY,c=1,i=1 to count stall cycles */ 
     intel_perfmon_event_map[PERF_COUNT_HW_STALLED_CYCLES_FRONTEND] = 
      X86_CONFIG(.event=0x0e, .umask=0x01, .inv=1, .cmask=1); 
     /* UOPS_DISPATCHED.THREAD,c=1,i=1 to count stall cycles*/ 
     intel_perfmon_event_map[PERF_COUNT_HW_STALLED_CYCLES_BACKEND] = 
      X86_CONFIG(.event=0xb1, .umask=0x01, .inv=1, .cmask=1); 

только интерфейс стойло определяется для Ivy Bridge

case INTEL_FAM6_IVYBRIDGE: 
    case INTEL_FAM6_IVYBRIDGE_X: 

     /* UOPS_ISSUED.ANY,c=1,i=1 to count stall cycles */ 
     intel_perfmon_event_map[PERF_COUNT_HW_STALLED_CYCLES_FRONTEND] = 
      X86_CONFIG(.event=0x0e, .umask=0x01, .inv=1, .cmask=1); 

Нет отображения для веб-интерфейсе и серверными стойла для более поздних настольных процессоров (Haswell, Бродуэлла, Skylake, Каби озеро) и Фи (KNL, KNM):

case INTEL_FAM6_HASWELL_CORE: 
    case INTEL_FAM6_HASWELL_X: 
    case INTEL_FAM6_HASWELL_ULT: 
    case INTEL_FAM6_HASWELL_GT3E: 

    case INTEL_FAM6_BROADWELL_CORE: 
    case INTEL_FAM6_BROADWELL_XEON_D: 
    case INTEL_FAM6_BROADWELL_GT3E: 
    case INTEL_FAM6_BROADWELL_X: 


    case INTEL_FAM6_XEON_PHI_KNL: 
    case INTEL_FAM6_XEON_PHI_KNM: 


    case INTEL_FAM6_SKYLAKE_MOBILE: 
    case INTEL_FAM6_SKYLAKE_DESKTOP: 
    case INTEL_FAM6_SKYLAKE_X: 
    case INTEL_FAM6_KABYLAKE_MOBILE: 
    case INTEL_FAM6_KABYLAKE_DESKTOP: 

Не определено для старого Core2 тоже (не проверял Atoms):

http://elixir.free-electrons.com/linux/v4.11/source/arch/x86/events/intel/core.c#L27

static u64 intel_perfmon_event_map[PERF_COUNT_HW_MAX] __read_mostly = 
{ 
    [PERF_COUNT_HW_CPU_CYCLES]  = 0x003c, 
    [PERF_COUNT_HW_INSTRUCTIONS]  = 0x00c0, 
    [PERF_COUNT_HW_CACHE_REFERENCES] = 0x4f2e, 
    [PERF_COUNT_HW_CACHE_MISSES]  = 0x412e, 
    [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = 0x00c4, 
    [PERF_COUNT_HW_BRANCH_MISSES]  = 0x00c5, 
    [PERF_COUNT_HW_BUS_CYCLES]  = 0x013c, 
    [PERF_COUNT_HW_REF_CPU_CYCLES]  = 0x0300, /* pseudo-encoding */ 
}; 
Смежные вопросы