2012-04-23 11 views
22

Recuerdo que supongo que un golpe de caché L1 es de 1 ciclo (es decir, idéntico al tiempo de acceso de registro) en mi clase de arquitectura, pero ¿eso es cierto en los procesadores x86 modernos?Ciclos/costo para L1 Cache hit vs. Register on x86?

¿Cuántos ciclos tarda una caché L1? ¿Cómo se compara para registrar el acceso?

+0

Varía según el procesador, pero no sé de dónde sea * bastante * tan rápido como un registro: aproximadamente 1 a 5 relojes más lento es bastante típico. –

+2

No conozco ninguna arquitectura en la que L1 tenga latencia de ciclo único. Además, no conozco ninguna arquitectura x86 donde el acceso de registro tenga una latencia medible en sí misma (puede percibirse cierta latencia debido a otros factores). – harold

+0

Vea http://www.7-cpu.com/cpu/Haswell.html: algunos números de latencia por-caché y por-TLB, y algunos números experimentales. Véase también [pdf de microarmen de Agner Fog] (http://agner.org/optimize/) y otros enlaces en la [wiki de la etiqueta x86] (http://stackoverflow.com/tags/x86/info). La latencia de uso de carga L1 de Haswell es de 4 ciclos, que es típica de las CPU modernas x86. La latencia de recarga de la tienda es de 5 ciclos y no está relacionada con el acierto o fallo de la memoria caché (es el reenvío de la tienda, no la caché). Como dice Harold, el acceso de registro es de 0 ciclos (por ejemplo, 'inc eax' tiene 1 ciclo de latencia,' inc [mem] 'tiene 6 ciclos de latencia (ALU + reenvío de tienda). –

Respuesta

32

Aquí hay un gran artículo sobre el tema:

http://arstechnica.com/gadgets/reviews/2002/07/caching.ars/1

para responder a sus pregunta: sí, un golpe de caché tiene aproximadamente el mismo costo que un acceso de registro. Y por supuesto, un error de caché es bastante costoso;)

PS:

Los detalles varían, pero este enlace tiene algunas buenas cifras aproximadas:

Approximate cost to access various caches and main memory?

Core i7 Xeon 5500 Series Data Source Latency (approximate) 
L1 CACHE hit, ~4 cycles 
L2 CACHE hit, ~10 cycles 
L3 CACHE hit, line unshared ~40 cycles 
L3 CACHE hit, shared line in another core ~65 cycles 
L3 CACHE hit, modified in another core ~75 cycles remote 
L3 CACHE ~100-300 cycles 
Local DRAM ~30 ns (~120 cycles) 
Remote DRAM ~100 ns 

PPS:

Estas cifras representan mucho CPUs más antiguas y lentas, pero las razones básicamente son:

http://arstechnica.com/gadgets/reviews/2002/07/caching.ars/2

Level     Access Time Typical Size Technology Managed By 
-----     ----------- ------------ ---------  ----------- 
Registers    1-3 ns  ?1 KB   Custom CMOS Compiler 
Level 1 Cache (on-chip) 2-8 ns  8 KB-128 KB SRAM   Hardware 
Level 2 Cache (off-chip) 5-12 ns  0.5 MB - 8 MB SRAM   Hardware 
Main Memory    10-60 ns  64 MB - 1 GB DRAM   Operating System 
Hard Disk    3M - 10M ns 20 - 100 GB Magnetic  Operating System/User 
+2

¿Cómo es posible que acceder a la memoria caché L3 puede tomar de 100 a 300 ciclos, mientras que el acceso a la DRAM local solo toma alrededor de 120 ciclos? ¿Eso significa que la memoria caché L3 puede ser más de dos veces más lenta que DRAM, que se utiliza en la memoria principal? – user2316602

+0

@ user2316602: me parece falso, a menos que se suponga que la fila de la tabla sea para la memoria caché L3 de una CPU en un socket diferente. (Es un sistema Nehalem Xeon, por lo que la memoria principal y L3 son NUMA.) –

1

Si no recuerdo mal, se trata de 1-2 ciclos de reloj, pero esta es una estimación y los cachés más nuevos pueden ser más rápidos. Esto está fuera de un libro de Arquitectura de Computadora que tengo y esta es información para AMD, por lo que Intel puede ser un poco diferente, pero lo vincularía entre 5 y 15 ciclos de reloj, lo que me parece una buena estimación.

EDIT: ¡Vaya L2 es de 10 ciclos con acceso TAG, L1 tarda de 1 a dos ciclos, mi error: \

+0

Simplemente comprobando, estás hablando de un * hit * y no * miss *, ¿verdad? – Mehrdad

+0

Sí, el acceso TAG solo toma 2 ciclos, creo, y el resto del tiempo es desde el acceso al caché y la carga. –

+0

Eh, ¡gracias! +1 – Mehrdad

0

En realidad, el costo del acierto de caché L1 es casi lo mismo que un coste de acceso a registro. Fue sorprendente para mí, pero esto es cierto, al menos para mi procesador (Athlon 64). Hace algún tiempo, escribí una aplicación de prueba simple para comparar la eficiencia del acceso a los datos compartidos en un sistema multiprocesador. El cuerpo de la aplicación es una variable de memoria simple que se incrementa durante el período de tiempo predefinido. Para hacer una compilación, comparé la variable no compartida al principio. Y durante esa actividad capturé el resultado, pero luego, durante el desmontaje de la aplicación, descubrí que el compilador se había dejado engañar por mis expectativas y aplicaba una optimización no deseada a mi código. Simplemente pone variable en el registro de la CPU y lo incrementa iterativamente en el registro sin acceso a la memoria. Pero se logró una verdadera sorpresa después de forzar a compliler a usar variable en memoria en lugar de variable de registro. En la aplicación actualizada obtuve casi los mismos resultados de evaluación comparativa. La degradación del rendimiento fue realmente despreciable (~ 1-2%) y parece relacionada con algún efecto secundario.

Como resultado:

1) Creo que se puede considerar caché L1 como un procesador no administrado registra piscina.

2) No hay ningún motivo para aplicar una optimización brutal al forzar al compilador a acceder con frecuencia a los datos en los registros del procesador. Si se accede con frecuencia a ellos, vivirán en la caché L1 y, debido a esto, tendrán el mismo costo de acceso que el registro del procesador.

+0

Su punto de referencia era incorrecto, entonces, o estaba embotellado en alguna otra cosa. 'inc [mem]' tiene latencia 6c en Intel Haswell, y similar en AMD. 'inc eax' tiene latencia de 1 ciclo en todas las CPU modernas x86. Esa es la latencia de reenvío de tienda, no la latencia L1. La latencia de uso de carga L1 es más parecida a 4 ciclos. Consulte el pdf de microarmen de Agner Fog y otros enlaces en la wiki [etiqueta x86] (http://stackoverflow.com/tags/x86/info). –

3

Para obtener más información sobre el ciclo de recuento y la ejecución fuera de servicio, consulte Agner Fog's microarch pdf y otros enlaces en el x86 tag wiki.


La latencia de uso de carga de Intel Haswell's L1 es de 4 ciclos, lo que es típico de las CPU modernas x86. es decir, qué tan rápido mov eax, [eax] se puede ejecutar en un bucle, con un puntero que apunta a sí mismo. (O a una pequeña lista de enlaces cerrados).

La latencia de uso de carga es 1 ciclo más alta para los vectores SSE/AVX en las CPU de Intel.


latencia tienda-recarga es de 5 ciclos, y no está relacionada con caché impredecible (que es la tienda de reenvío, no caché L1).

Como comentó harold, el acceso de registro es 0 ciclos. Así, por ejemplo:

  • inc eax tiene 1 latencia ciclo (sólo la operación ALU)
  • inc dword [mem] tiene 6 ciclo de latencia hasta que una carga de dword [mem] estará listo. (ALU + reenvío de tienda). p.ej. mantener un contador de bucle en la memoria limita un bucle a una iteración por cada 6 ciclos.
  • mov rax, [rsi] tiene una latencia de 4 ciclos de rsi estar listo para rax estar listo en un éxito L1 (L1 carga de usar latencia.)

http://www.7-cpu.com/cpu/Haswell.html tiene una tabla de latencia por caché (que voy a copie aquí), y algunos otros números experimentales, incluyendo L2-TLB, alcanzan la latencia (en una falla L1DTLB).

Intel i7-4770 (Haswell), 3,4 GHz (Turbo Boost desactivado), 22 nm. RAM: 32 GB (PC3-12800 cl11 cr2).

  • L1 Caché de datos = 32 KB, 64 B/línea, 8 VÍAS.
  • L1 caché de instrucciones = 32 KB, 64 B/línea, 8 VÍAS.
  • caché L2 = 256 KB, 64 B/línea, 8-WAY
  • L3 cache = 8 MB, 64 B/línea

  • L1 Caché de datos Latencia = 4 ciclos para un acceso sencillo a través de puntero (mov rax, [rax])

  • L1 Latencia del caché de datos = 5 ciclos para el acceso con el cálculo de direcciones complejas (mov rax, [rsi + rax*8]).
  • L2 Cache de latencia = 12 ciclos
  • L3 Cache Latencia = 36 ciclos
  • RAM de latencia = 36 ciclos + 57 ns

La página de referencia de nivel superior es http://www.7-cpu.com/utils.html, pero todavía doesn' Realmente explicar qué significan los diferentes tamaños de prueba, pero el código está disponible. Los resultados de la prueba incluyen Skylake, que es casi lo mismo que Haswell en esta prueba.

La respuesta de @ paulsm4 tiene una tabla para un Nehalem Xeon de varios sockets, que incluye algunos números de memoria/L3 remotos (otro zócalo).