Según el autor de estos eventos, se definieron libremente y se aproximan por los contadores de rendimiento de CPU disponibles. Como sé, perf no admite fórmulas para calcular algún evento sintético basado en varios eventos de hardware, por lo que no puede usar el método de bloqueo de front-end / back-end del manual de optimización de Intel (implementado en VTune) http: // www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-optimization-manual.pdf "B.3.2 Metodología jerárquica de caracterización del rendimiento de arriba hacia abajo"
%FE_Bound = 100 * (IDQ_UOPS_NOT_DELIVERED.CORE / N );
%Bad_Speculation = 100 * ( (UOPS_ISSUED.ANY – UOPS_RETIRED.RETIRE_SLOTS + 4 * INT_MISC.RECOVERY_CYCLES ) / N) ;
%Retiring = 100 * ( UOPS_RETIRED.RETIRE_SLOTS/ N) ;
%BE_Bound = 100 * (1 – (FE_Bound + Retiring + Bad_Speculation) ) ;
N = 4*CPU_CLK_UNHALTED.THREAD" (for SandyBridge)
Las fórmulas correctas se pueden usar con algunas secuencias de comandos externas, como se hizo en pmu-tools ( toplev.py
) de Andi Kleen : https://github.com/andikleen/pmu-tools (fuente), http://halobates.de/blog/ p / 262 (descripción):
% toplev.py -d -l2 numademo 100M stream
...
perf stat --log-fd 4 -x, -e
{r3079,r19c,r10401c3,r100030d,rc5,r10e,cycles,r400019c,r2c2,instructions}
{r15e,r60006a3,r30001b1,r40004a3,r8a2,r10001b1,cycles}
numademo 100M stream
...
BE Backend Bound: 72.03%
This category reflects slots where no uops are being delivered due to a lack
of required resources for accepting more uops in the Backend of the pipeline.
.....
FE Frontend Bound: 54.07%
This category reflects slots where the Frontend of the processor undersupplies
its Backend.
Compromiso que introdujo eventos de parada de ciclos de interfaz y de ciclos de parada de fondo en lugar del universal original stalled-cycles
:
http://git.kernel.org/cgit/linux/kernel/git/tip/tip.git/commit/?id=8f62242246351b5a4bc0c1f00c0c7003edea128a
author Ingo Molnar <mingo@el...> 2011-04-29 11:19:47 (GMT)
committer Ingo Molnar <mingo@el...> 2011-04-29 12:23:58 (GMT)
commit 8f62242246351b5a4bc0c1f00c0c7003edea128a (patch)
tree 9021c99956e0f9dc64655aaa4309c0f0fdb055c9
parent ede70290046043b2638204cab55e26ea1d0c6cd9 (diff)
Perf events: agregue definiciones de eventos de ciclo estancado de front-end y back-end genéricos. Agregue dos eventos de hardware genéricos: ciclos estancados de front-end y back-end.
Estos eventos miden las condiciones cuando la CPU está ejecutando código pero sus capacidades no se utilizan por completo. Comprender estas situaciones y analizarlas es una subtarea importante de los flujos de trabajo de optimización de código.
Ambos eventos limitan el rendimiento: la mayoría de los bloqueos de front-end tienden a ser causados por predicciones erróneas de rama o errores de búsqueda de instrucciones, los bloqueos de backend pueden ser causados por diversas escaseces de recursos o programación de instrucciones ineficiente.
Las paradas de front-end son las más importantes: el código no puede ejecutarse rápidamente si no se mantiene el flujo de instrucciones.
Un back-end sobreutilizado puede causar paradas en el front-end y, por lo tanto, también debe vigilarse.
La composición exacta depende en gran medida de la lógica del programa y de la combinación de instrucciones.
Usamos los términos 'stall', 'front-end' y 'back-end' de manera flexible e intentamos usar los mejores eventos disponibles de CPU específicas que se aproximen a estos conceptos.
Cc: Peter Zijlstra Cc: Arnaldo Carvalho de Melo Cc: Frederic Weisbecker Enlace: http://lkml.kernel.org/n/tip-7y40wib8n000io7hjpn1dsrm@git.kernel.org
Firmado por: Ingo Molnar
/* Install the stalled-cycles event: UOPS_EXECUTED.CORE_ACTIVE_CYCLES,c=1,i=1 */
- intel_perfmon_event_map[PERF_COUNT_HW_STALLED_CYCLES] = 0x1803fb1;
+ intel_perfmon_event_map[PERF_COUNT_HW_STALLED_CYCLES_BACKEND] = 0x1803fb1;
- PERF_COUNT_HW_STALLED_CYCLES = 7,
+ PERF_COUNT_HW_STALLED_CYCLES_FRONTEND = 7,
+ PERF_COUNT_HW_STALLED_CYCLES_BACKEND = 8,