2017-02-10 2 views
3

Je veux comprendre quels événements peuvent avoir le modificateur précis sur mon CPU (Sandy Bridge).Quels événements perf peuvent utiliser PEBS?

Intel Software Manuel du développeur (. Tableau 18-32 PEBS Performance événements pour code microarchitecture Intel Nom Sandy Bridge) contient seulement les événements suivants: INST_RETIRED, UOPS_RETIRED, BR_INST_RETIRED, BR_MISP_RETIRED, MEM_UOPS_RETIRED, MEM_LOAD_UOPS_RETIRED, MEM_LOAD_UOPS_LLC_HIT_RETIRED. Et SandyBridge_core_V15.json énumère les mêmes événements avec PEBS> 0.

Cependant, il y a some examples d'utiliser perf, qui ajoutent :p à l'événement cycles. Et je peux exécuter avec succès perf record -e cycles:p sur ma machine.

Egalement perf record -e cycles:p -vv -- sleep 1 imprime precise_ip 1. Cela signifie-t-il que l'événement CPU_CLK_UNHALTED utilise réellement le PEBS?

Est-il possible d'obtenir la liste complète des événements, qui supportent :p?

+0

Ilya, essayez [ocperf de pmu-outils intel] (https://github.com/andikleen/ pmu-tools). Il a la liste complète des processeurs Intel ('ocperf list'?), Et vanilla perf n'a pas de liste complète dans l'espace utilisateur. Est-ce que le rapport de perf avec en-tête l'impression du rapport non nul précis_ip (il peut être requis par enregistrement mais désactivé par le noyau)? Quelle est votre version du noyau? ['précise_ip' de 1 est" SAMPLE_IP doit avoir un dérapage constant "] (http://lxr.free-electrons.com/source/include/uapi/linux/perf_event.h?v=4.8#L323) – osgx

Répondre

2

Il y a hack pour soutenir cycles:p sur SandyBridge qui n'a pas de PEBS pour CPU_CLK_UNHALTED.*. Le hack est implémenté dans la partie noyau de perf dans intel_pebs_aliases_snb(). Lorsque utilisateur demande -e cycles qui est PERF_COUNT_HW_CPU_CYCLES (se traduit CPU_CLK_UNHALTED.CORE) avec non nul modificateur precise, cette fonction change événement matériel à UOPS_RETIRED.ALL avec PEBS:

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 } 

Le hack intel_pebs_aliases_snb est enregistré dans 3557 __init int intel_pmu_init(void) pour case INTEL_FAM6_SANDYBRIDGE:/case INTEL_FAM6_SANDYBRIDGE_X: comme

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 est appelée à partir de intel_pmu_hw_config() lorsque precise_ip est définie sur une valeur non nulle:

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 } 

L'entaille a été mis en œuvre en 2012, le fil LKML "[PATCH] de perf, x86: Faire cycles: p travail BNS", « [Recommandation: perf/core] perf/x86: Mettre en œuvre des cycles: p pour BNS/IVB », cccb9ba9e4ee0d750265f53de9258df69655c40b, http://git.kernel.org/cgit/linux/kernel/git/tip/tip.git/commit/?id=cccb9ba9e4ee0d750265f53de9258df69655c40b:

perf/x86: Mettre en œuvre des cycles: p SNB/IVB

maintenant qu'il ya enfin une puce avec PEBS de travail (Ivybridge), nous pouvons activer le matériel et implémenter des cycles: p pour SNB/IVB.

Et je pense, il n'y a pas la liste complète de cette bidouille conversion « précise » en plus du code source de Linux dans arch/x86/events/intel/core.c, grep pour static void intel_pebs_aliases (généralement cycles:p/CPU_CLK_UNHALTED 0x003c est mis en œuvre) et vérifier intel_pmu_init pour le modèle réel et x86_pmu.pebs_aliases exacte variante sélectionnée:

  • intel_pebs_aliases_core2, INST_RETIRED.ANY_P (0x00c0) CNTMASK=16 au lieu de cycles:p
  • intel_pebs_aliases_snb, UOPS_RETIRED.ALL (0x01c2) CNTMASK=16 au lieu d'cycles:p
  • intel_pebs_aliases_precdist pour les plus hautes valeurs de precise_ip, INST_RETIRED.PREC_DIST (0x01c0) au lieu de cycles:ppp sur SKL, IVB, HSW, BDW
+0

Expérimentez avec' perf stat -e cycles, cycles: p, instructions, task-clock./program' montrent que 'cycles' ne sont pas exactement égaux à' cycles: p' quand le hack est utilisé. Mais la différence est inférieure à 0,1%. – osgx