2012-09-26 22 views
22

Estoy intentando averiguar por qué un programa C modificado se ejecuta más rápido que su contraparte no modificada (estoy agregando muy pocas líneas de código para realizar algún trabajo adicional). En este contexto, sospecho que "efectos de caché" es la explicación principal (caché de instrucciones). De este modo llego a la herramienta de perfilado perf (https://perf.wiki.kernel.org/index.php/Main_Page) pero por desgracia no soy capaz de entender el significado de sus resultados con respecto a los errores de caché. Se proporcionan¿Qué significan los eventos de perf cache?

Varios eventos sobre caché:

cache-references         [Hardware event] 
    cache-misses          [Hardware event] 
    L1-dcache-loads         [Hardware cache event] 
    L1-dcache-load-misses        [Hardware cache event] 
    L1-dcache-stores         [Hardware cache event] 
    L1-dcache-store-misses        [Hardware cache event] 
    L1-dcache-prefetches        [Hardware cache event] 
    L1-dcache-prefetch-misses       [Hardware cache event] 
    L1-icache-loads         [Hardware cache event] 
    L1-icache-load-misses        [Hardware cache event] 
    L1-icache-prefetches        [Hardware cache event] 
    L1-icache-prefetch-misses       [Hardware cache event] 
    LLC-loads           [Hardware cache event] 
    LLC-load-misses         [Hardware cache event] 
    LLC-stores           [Hardware cache event] 
    LLC-store-misses         [Hardware cache event] 
    LLC-prefetches          [Hardware cache event] 
    LLC-prefetch-misses        [Hardware cache event] 
    dTLB-loads           [Hardware cache event] 
    dTLB-load-misses         [Hardware cache event] 
    dTLB-stores          [Hardware cache event] 
    dTLB-store-misses         [Hardware cache event] 
    dTLB-prefetches         [Hardware cache event] 
    dTLB-prefetch-misses        [Hardware cache event] 
    iTLB-loads           [Hardware cache event] 
    iTLB-load-misses         [Hardware cache event] 
    branch-loads          [Hardware cache event] 
    branch-load-misses         [Hardware cache event] 
    node-loads           [Hardware cache event] 
    node-load-misses         [Hardware cache event] 
    node-stores          [Hardware cache event] 
    node-store-misses         [Hardware cache event] 
    node-prefetches         [Hardware cache event] 
    node-prefetch-misses        [Hardware cache event] 

¿Dónde puedo encontrar una explicación acerca de estos campos? el evento cache-missing es siempre más pequeño que otros eventos. ¿Qué mide este evento?

cómo interpretar los 26.760 L1-iCache-carga-accidentes para ls vs los 5.708 cache-accidentes en el siguiente ejemplo?

perf stat -e L1-icache-load-misses ls 
caches caches~ out 

Performance counter stats for 'ls': 

      26,760 L1-icache-load-misses          

     0.002816690 seconds time elapsed 



perf stat -e cache-misses ls 
caches caches~ out 

Performance counter stats for 'ls': 

      5,708 cache-misses             

     0.002822122 seconds time elapsed 

Respuesta

17

usted parece pensar que el evento cache-misses es la suma de todo otro tipo de fallos de caché (L1-dcache-load-misses, y así sucesivamente). Eso no es verdad.

el evento cache-misses representa el número de acceso a la memoria que no pudo ser servido por ninguna de la memoria caché.

Admito que la documentación de perf no es la mejor.

Sin embargo, se puede aprender mucho al leer leyendo (asumiendo que ya tiene un buen conocimiento de cómo funcionan una CPU y una unidad de monitorización del rendimiento, claramente no es un curso de arquitectura informática) el documento del perf_event_open() función:

http://web.eece.maine.edu/~vweaver/projects/perf_events/perf_event_open.html

por ejemplo, mediante la lectura de ella se puede ver que el evento cache-misses mostró por la lista de Potencia corresponde a PERF_COUNT_HW_CACHE_MISSES

22

Algunas respuestas:

  • L1 es la caché de nivel 1, el más pequeño y más rápido uno. LLC por otro lado se refiere al último nivel del cache hierarchy, lo que denota el caché más grande pero más lento.
  • i vs d distingue caché de instrucciones de la memoria caché de datos. Solo L1 se divide de esta manera, otras cachés se comparten entre los datos y las instrucciones.
  • TLB se refiere a la translation lookaside buffer, una memoria caché utiliza cuando el mapeo de direcciones virtuales a físicas.
  • Diferentes contadores TLB según si la dirección indicada hace referencia a una instrucción o algunos datos.
  • para todos los accesos de datos, distintos contadores se mantienen en función de si se ha leído la localización de memoria dada, escrita o prebuscados (es decir, recuperada para la lectura en algún momento posterior).
  • El número de fallos indica con qué frecuencia se accede a un elemento dado de datos, pero no presente en la memoria caché.
+0

Gracias por la respuesta. ¿Estás usando esta herramienta?¿Cómo se explica el evento cache-misses denominado evento de hardware y no evento de caché de hardware? Pensé que era la suma de los demás, pero no del todo. –

+0

Y, además, ¿cuál es la diferencia entre "cargas" y "prefetches"? –

+0

@ManuelSelva: No estoy usando 'perf', así que tengo poca experiencia real. En particular, no estoy seguro de qué es lo que describe el evento 'cache-misses' en comparación con todos los eventos de caché de hardware. Tampoco estoy del todo seguro acerca de las captaciones anticipadas: hay una manera de desencadenar las captaciones previas en el nivel de la aplicación, así como las captaciones previas automáticas de acceso a datos predichos por el hardware. Cualquiera de estos o ambos pueden ser lo que describen los contadores de captación previa. La documentación 'perf' menciona las especificaciones del fabricante para más detalles, pero aún no he encontrado las secciones relevantes. – MvG

Cuestiones relacionadas