2016-04-01 6 views
3

Ich habe Perf auf Haswell CPU (Intel Core i7-4790) installiert. Aber die "Perf-Liste" beinhaltet nicht "stalled-cycles-frontend" oder "stalled-cycles-backend". Ich habe die http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html überprüft und die Leistungsereignisse, die für das stalled-cycles-backend relevant sind, nicht aus der Tabelle 19-7 (Nicht-Architektonische Leistungsereignisse im Prozessorkern der Intel Core Prozessoren der 4. Generation) gefunden.Haswell Mikroarchitektur haben nicht blockiert-Zyklen-Backend in Perf

Also meine Frage ist: Wie kann ich festgedauert-Zyklen-Backend mit perf oder anderen Tools in Haswell CPU-Kerne messen. Der Kernel ist 3.19 und perf Version ist auch 3.19.

Dank

+1

Haben Sie versucht, [ 'ocperf.py'] (https://lwn.net/Articles/556983/)? Es ist ein Wrapper mit mehr hw-spezifischen Ereignisnamen. Funktioniert 'perf stat' normal? Es enthält standardmäßig diese Leistungsindikatoren. –

+0

@PeterCordes Dank Ihrer Antwort habe ich ocperf ausprobiert und die sogenannten "cycle_activity.cycles_no_execute", "uops_executed.stall_cycles" und "uops_retired.stall_cycles" gefunden. Aber ich bin mir nicht sicher, ob das "Festplatten-Zyklen-Backend" sind. –

+0

hank wing, wahrscheinlich, Autoren von 'perf_events' Subsystem Mapping waren auch unsicher und einfach nicht zugeordnet (schlecht entworfen und benannt)" stalled-Zyklen-Backend "in ein einzelnes Ereignis auf haswell? ([Der Code] (http://elixir.free-electronics.com/linux/v4.11/source/arch/x86/events/intel/core.c#L3856), es gibt eine Zuordnung von 'PERF_COUNT_HW_STALLED_CYCLES_BACKEND' für Westmere WSM, Sandy SNB; nicht für Ivy, Haswell, Broadwell und neuer). Autoren von [toplev.py] (https://github.com/andikleen/pmu-tools/blob/master/toplev.py) oder PAPI können komplexe Ereignisse zuordnen, sie können Formeln verwenden, um sie aus mehreren zu berechnen. – osgx

Antwort

1

Ja, gibt es keine Zuordnung von "abgewürgt-Zyklen-Frontend" und "abgewürgt-Zyklen-Backend" synthetischer Ereignissen in perf_events Subsystem im Kernel für neue Prozessoren wie Ivy Bridge oder Haswell. Und kein Mapping auf älteren Core 2. Wahrscheinlich ist dieser Name/Konzept/Idee nicht gut für veränderte und komplexe Mikroarchitekturen moderner Out-of-Order-CPUs ohne einfache skalare Messung des globalen "Stall".

Der Code is in arch/x86/events/intel/core.c, und das synthetische Ereignisnamen sind PERF_COUNT_HW_STALLED_CYCLES_FRONTEND und PERF_COUNT_HW_STALLED_CYCLES_BACKEND:

__init int intel_pmu_init(void) 
{... 

Beide seit Nehalem definiert sind, für 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); 

Nur Frontend Stall ist definiert für 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); 

Keine Zuordnung für Frontend und Back-End-Stände für neueren CPUs Desktop (Haswell, Broadwell, Skylake, Kaby See) und Phi (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: 

Nicht zu für alte Core2 definiert (nicht überprüfen Atom):

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 */ 
};