tipos memoria chip cache caching x86 cpu cpu-cache

caching - memoria - Ciclos/costo para L1 Cache hit vs. Register on x86?



cpu cache levels (4)

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

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

Para responder a su pregunta, sí, un golpe de caché tiene aproximadamente el mismo costo que un acceso de registro. Y, por supuesto, una falla de caché es bastante costosa;)

PD:

Los detalles variarán, pero este enlace tiene algunas buenas figuras de estadio:

¿Costo aproximado para acceder a varias memorias caché y memoria principal?

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 CPU mucho más antiguas y más 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

Recuerdo que asumí 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?

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


En realidad, el costo del golpe de caché L1 es casi el mismo que el costo del acceso de 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 puede considerar la caché L1 como un grupo de registros de procesador no administrado.

2) No hay ningún sentido para aplicar la optimización brutal de la asamblea obligando al compilador a acceder frecuentemente 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.


Para obtener más información sobre el recuento cíclico y la ejecución fuera de orden, consulte el pdf de microarmen de Agner Fog y otros enlaces en la wiki de la etiqueta x86 .

La latencia de uso de carga L1 de Intel Haswell es de 4 ciclos, que es típica de las CPU modernas x86. es decir, qué tan rápido mov eax, [eax] puede ejecutarse 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 Intel.

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é L1).

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

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

7-cpu.com/cpu/Haswell.html tiene una tabla de latencia por caché (que copiaré aquí), y algunos otros números experimentales, incluyendo L2-TLB, golpean la latencia (en un L1DTLB fallan )

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

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

  • Latencia de caché de datos L1 = 4 ciclos para acceso simple mediante puntero ( mov rax, [rax] )

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

La página de referencia de nivel superior es http://www.7-cpu.com/utils.html , pero todavía no explica realmente 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 múltiples sockets, que incluye algunos números de memoria / L3 remotos (otros zócalos).


Si recuerdo correctamente, se trata de 1-2 ciclos de reloj, pero esta es una estimación y los cachés más recientes 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.

EDITAR: Whoops L2 es de 10 ciclos con acceso TAG, L1 lleva de 1 a 2 ciclos, mi error: /