¿Costo aproximado para acceder a varios cachés y memoria principal?

178

¿Alguien puede darme el tiempo aproximado (en nanosegundos) para acceder a los cachés L1, L2 y L3, así como a la memoria principal en los procesadores Intel i7?

Si bien esto no es específicamente una pregunta de programación, conocer este tipo de detalles de velocidad es necesario para algunos desafíos de programación de baja latencia.

Ted Graham
fuente
1
¿Cómo convierto ns en ciclos? Si simplemente divido 100 ns por 2.3 GHz, obtengo 230 ciclos. ¿Es esto correcto?
Nathan
55
Tengo curiosidad: ¿en qué situación el caché L3 remoto es más lento que el DRAM remoto? El número anterior indica que puede ser 1.6 veces más lento.
netvope
1
No edite la pregunta, sino publique una respuesta con esos detalles. La respuesta automática está bien en SO.
Stijn de Witt
¿Existen valores aproximados para el consumo de energía para el acceso a la memoria desde cada nivel?
kanna

Respuestas:

74

Aquí hay una Guía de análisis de rendimiento para la gama de procesadores i7 y Xeon. Debo enfatizar, esto tiene lo que necesita y más (por ejemplo, consulte la página 22 para ver algunos tiempos y ciclos, por ejemplo).

Además, esta página tiene algunos detalles sobre ciclos de reloj, etc. El segundo enlace sirvió a los siguientes números:

Core i7 Xeon 5500 Series Data Source Latency (approximate)               [Pg. 22]

local  L1 CACHE hit,                              ~4 cycles (   2.1 -  1.2 ns )
local  L2 CACHE hit,                             ~10 cycles (   5.3 -  3.0 ns )
local  L3 CACHE hit, line unshared               ~40 cycles (  21.4 - 12.0 ns )
local  L3 CACHE hit, shared line in another core ~65 cycles (  34.8 - 19.5 ns )
local  L3 CACHE hit, modified in another core    ~75 cycles (  40.2 - 22.5 ns )

remote L3 CACHE (Ref: Fig.1 [Pg. 5])        ~100-300 cycles ( 160.7 - 30.0 ns )

local  DRAM                                                   ~60 ns
remote DRAM                                                  ~100 ns

EDIT2:
Lo más importante es el aviso debajo de la tabla citada, que dice:

"NOTA: ESTOS VALORES SON APROXIMACIONES GRANDES. DEPENDEN DE LAS FRECUENCIAS BÁSICAS Y DESCONOCIDAS, VELOCIDADES DE MEMORIA, CONFIGURACIÓN DEL BIOS, NÚMEROS DE DIMMS , ETC, ETC ... SU MILLAJE PUEDE VARIAR " .

EDITAR: Debo resaltar que, además de la información de tiempo / ciclo, el documento de inteligencia anterior aborda muchos más (extremadamente) detalles útiles de la gama de procesadores i7 y Xeon (desde el punto de vista del rendimiento).

Dave
fuente
1
La "línea no compartida" no debería tener más latencia que la "línea compartida en otro núcleo": una línea compartida (es decir, 2 bits válidos de núcleo) significa que puede tomarse directamente del segmento LLC, ya que se garantiza que está limpia. 'Línea no compartida' significa que solo hay un bit válido de núcleo y ese núcleo debe ser indagado para garantizar que la línea sea exclusiva y no modificada; si se modifica, se cambia a compartida; LLC ahora se ensucia y se devuelve al núcleo solicitante como compartido. Tal vez me equivoque, sé que el protocolo MOESI es diferente.
Lewis Kelsey
1
Ciertamente este es el caso en SnB y Haswell. Nehalem, que utiliza este Xeon, estaba antes de la topología del bus de anillo y tenía un caché unificado, pero no veo por qué el filtro snoop se comportaría de manera diferente en Nehalem. La sección del manual de optimización B.3.5.3 da lo que creo que es una descripción incorrecta (claramente pertenece a Nehalem, ya que habla sobre la Cola Global, que es una característica de Nehalem). Este artículo de Haswell tiene una mejor descripción (columna superior derecha de la página 5) ( tu-dresden.de/zih/forschung/ressourcen/dateien/… )
Lewis Kelsey
@LewisKelsey: Esto también me sorprende, porque pensé que la mitad del punto de inclusión de L3 era que L3 simplemente podría responder si tuviera una copia válida de una línea. Pero recuerde, Intel usa MESIF ( en.wikipedia.org/wiki/MESIF_protocol ) para NUMA, AMD usa MOESI. Sin embargo, creo que dentro de un solo socket, MESIF no es realmente una cosa porque los datos provienen de L3, no core-> core. Por lo tanto, probablemente sea más relevante para las transferencias de caché L3-> caché a través de sockets. Me pregunto si este "golpe local de L3" es para una línea compartida con un núcleo en otro socket. Todavía no tiene sentido, válido en L3 significa que ningún núcleo tiene E / M
Peter Cordes
@PeterCordes Me acordé de este comentario y regresé y lo que dije me pareció inmediatamente incorrecto. Mi comentario es correcto en la perspectiva de un tercer núcleo en el que se comparte entre otros 2 núcleos o es exclusivo de otro núcleo. Pero si está hablando de una línea no compartida y pertenece al núcleo que está tratando de acceder a la línea, entonces el punto de referencia es correcto porque compartido requiere una RFO para obtenerla exclusiva y exclusiva significa que no se requiere dicha RFO. Así que no sé lo que estaba diciendo realmente.
Lewis Kelsey
@LewisKelsey: Sí, eso es todo cierto para escribir. Pensé que esto era para leer (Data Source Latency), que es más sensible a la latencia. Leer una línea nunca requiere una RFO, solo una solicitud para compartir. Entonces, ¿no debería una línea que ya está en estado compartido en algún lugar, simplemente presionar en el L3 de este socket sin tener que esperar el tráfico de coherencia? Y así ser más rápido que DRAM, similar a un golpe L3 "no compartido".
Peter Cordes
189

Números que todos deberían saber

           0.5 ns - CPU L1 dCACHE reference
           1   ns - speed-of-light (a photon) travel a 1 ft (30.5cm) distance
           5   ns - CPU L1 iCACHE Branch mispredict
           7   ns - CPU L2  CACHE reference
          71   ns - CPU cross-QPI/NUMA best  case on XEON E5-46*
         100   ns - MUTEX lock/unlock
         100   ns - own DDR MEMORY reference
         135   ns - CPU cross-QPI/NUMA best  case on XEON E7-*
         202   ns - CPU cross-QPI/NUMA worst case on XEON E7-*
         325   ns - CPU cross-QPI/NUMA worst case on XEON E5-46*
      10,000   ns - Compress 1K bytes with Zippy PROCESS
      20,000   ns - Send 2K bytes over 1 Gbps NETWORK
     250,000   ns - Read 1 MB sequentially from MEMORY
     500,000   ns - Round trip within a same DataCenter
  10,000,000   ns - DISK seek
  10,000,000   ns - Read 1 MB sequentially from NETWORK
  30,000,000   ns - Read 1 MB sequentially from DISK
 150,000,000   ns - Send a NETWORK packet CA -> Netherlands
|   |   |   |
|   |   | ns|
|   | us|
| ms|

De: Originalmente por Peter Norvig:
- http://norvig.com/21-days.html#answers
- http://surana.wordpress.com/2009/01/01/numbers-everyone-should-know/ ,
- http://sites.google.com/site/io/building-scalable-web-applications-with-google-app-engine

una comparación visual

Andrey
fuente
11
¿Seguramente estos importan cantidades ENORMES, basadas en el diseño del procesador, la latencia / frecuencia de ram, el almacenamiento en caché del disco duro (tipo y tamaño) / rpm, etc. Para citar INTEL (para los valores que lanzaron para una CPU específica): "NOTA: Estos valores son aproximaciones aproximadas. Dependen de las frecuencias Core y Uncore, la velocidad de la memoria, la configuración del BIOS, el número de DIMMS, etc. etc. SU MILLAJE PUEDE VARIAR. . "
Dave
28
@Dave eso es cierto, pero estos números muestran el orden de magnitud
Andrey
8
@Dave, a pesar de que el tipo / velocidad / arquitectura de la CPU es diferente, creo que el tiempo relativo debería permanecer más o menos igual, por lo que es solo una guía aproximada para saber cuándo codifica. Un análisis más significativo debe hacerse a través del generador de perfiles, por supuesto ...
xosp7tom
8
Para tener una idea de cuánto tiempo es, Wikipedia menciona "Un nanosegundo es por un segundo como un segundo es por 31.7 años". en.wikipedia.org/wiki/Nanosecond
Solo tú el
2
@kernel si falta la memoria caché, significa que requerirá acceso a la memoria caché de nivel inferior o incluso a la memoria principal. En este caso, llevará tiempo según el nivel de tiempo de acceso. Puede buscar datos para las CPU más nuevas aquí sisoftware.net/?d=qa&f=ben_mem_latency
Andrey
39

Costo para acceder a varios recuerdos en una bonita página

Resumen

  1. Los valores disminuyeron pero se estabilizaron desde 2005

            1 ns        L1 cache
            3 ns        Branch mispredict
            4 ns        L2 cache
           17 ns        Mutex lock/unlock
          100 ns        Main memory (RAM)
        2 000 ns (2µs)  1KB Zippy-compress
    
  2. Todavía algunas mejoras, predicción para 2020

       16 000 ns (16µs) SSD random read (olibre's note: should be less)
      500 000 ns (½ms)  Round trip in datacenter
    2 000 000 ns (2ms)  HDD random read (seek)
    

Ver también otras fuentes

Ver también

Para una mayor comprensión, recomiendo la excelente presentación de arquitecturas modernas de caché (junio de 2014) de Gerhard Wellein , Hannes Hofmann y Dietmar Fey en la Universidad Erlangen-Nürnberg .

Las personas de habla francesa pueden apreciar un artículo de SpaceFox que compara un procesador con un desarrollador, ambos a la espera de la información requerida para continuar trabajando.

olibre
fuente
Una hermosa publicación de latencia. sería bueno agregar los hechos sobre la realidad de enmascaramiento de latencia de GPU (
user3666197
Hola @ user3666197 ¿Tiene algunas fuentes sobre la latencia de memoria relacionada con la GPU? Saludos :-)
olibre
Ciertamente, sí, @olibre. Verifique lo [A]publicado a continuación.
user3666197
1
Dado que esto se trata de latencia y almacenamiento en caché, me parece irónico que la página en su primer enlace, con el control deslizante de año, no guarde en caché la visualización de la métrica al cambiar el año. En Firefox, al menos, se procesan demasiado lento para arrastrar los años para ser suave: /
John Glassmyer
1
Buenas referencias, ¡diste títulos y autores!
SamB
22

Solo en aras de la revisión de 2020 de las predicciones para 2025:

Durante los últimos 44 años de la tecnología de circuito integrado, los procesadores clásicos (no cuánticos) evolucionaron, literal y físicamente "Per Aspera ad Astra" . La última década ha evidenciado que el proceso clásico se ha acercado a algunos obstáculos, que no tienen un camino físico alcanzable hacia adelante.

Number of logical corespuede y puede crecer, pero no más de lo que es difícil, si no imposible, de eludir el techo basado en la física que ya puede alcanzar y puede crecer, pero puede crecer menos de (potencia, ruido, "reloj") , pero problemas con la distribución de energía y la disipación de calor aumentará puede crecer, teniendo beneficios directos de grandes huellas de caché y memoria de E / S más rápida y más amplia y beneficios indirectos de un cambio de contexto forzado del sistema con menos frecuencia, ya que podemos tener más núcleos para dividir otros hilos / procesos entreO(n^2~3)
Frequency [MHz]
Transistor CountO(n^2~3)
Power [W]
Single Thread Perf

Los créditos van a Leonardo Suriano y Karl Rupp
(Los créditos van a Leonardo Suriano y Karl Rupp)

2020: Still some improvements, prediction for 2025
-------------------------------------------------------------------------
             0.1 ns - NOP
             0.3 ns - XOR, ADD, SUB
             0.5 ns - CPU L1 dCACHE reference           (1st introduced in late 80-ies )
             0.9 ns - JMP SHORT
             1   ns - speed-of-light (a photon) travel a 1 ft (30.5cm) distance -- will stay, throughout any foreseeable future :o)
?~~~~~~~~~~~ 1   ns - MUL ( i**2 = MUL i, i )~~~~~~~~~ doing this 1,000 x is 1 [us]; 1,000,000 x is 1 [ms]; 1,000,000,000 x is 1 [s] ~~~~~~~~~~~~~~~~~~~~~~~~~
           3~4   ns - CPU L2  CACHE reference           (2020/Q1)
             5   ns - CPU L1 iCACHE Branch mispredict
             7   ns - CPU L2  CACHE reference
            10   ns - DIV
            19   ns - CPU L3  CACHE reference           (2020/Q1 considered slow on 28c Skylake)
            71   ns - CPU cross-QPI/NUMA best  case on XEON E5-46*
           100   ns - MUTEX lock/unlock
           100   ns - own DDR MEMORY reference
           135   ns - CPU cross-QPI/NUMA best  case on XEON E7-*
           202   ns - CPU cross-QPI/NUMA worst case on XEON E7-*
           325   ns - CPU cross-QPI/NUMA worst case on XEON E5-46*
|Q>~~~~~ 5,000   ns - QPU on-chip QUBO ( quantum annealer minimiser 1 Qop )
        10,000   ns - Compress 1K bytes with a Zippy PROCESS
        20,000   ns - Send     2K bytes over 1 Gbps  NETWORK
       250,000   ns - Read   1 MB sequentially from  MEMORY
       500,000   ns - Round trip within a same DataCenter
?~~~ 2,500,000   ns - Read  10 MB sequentially from  MEMORY~~(about an empty python process to copy on spawn)~~~~ x ( 1 + nProcesses ) on spawned process instantiation(s), yet an empty python interpreter is indeed not a real-world, production-grade use-case, is it?
    10,000,000   ns - DISK seek
    10,000,000   ns - Read   1 MB sequentially from  NETWORK
?~~ 25,000,000   ns - Read 100 MB sequentially from  MEMORY~~(somewhat light python process to copy on spawn)~~~~ x ( 1 + nProcesses ) on spawned process instantiation(s)
    30,000,000   ns - Read 1 MB sequentially from a  DISK
?~~ 36,000,000   ns - Pickle.dump() SER a 10 MB object for IPC-transfer and remote DES in spawned process~~~~~~~~ x ( 2 ) for a single 10MB parameter-payload SER/DES + add an IPC-transport costs thereof or NETWORK-grade transport costs, if going into [distributed-computing] model Cluster ecosystem
   150,000,000   ns - Send a NETWORK packet CA -> Netherlands
  |   |   |   |
  |   |   | ns|
  |   | us|
  | ms|

Solo por el examen de 2015 de las predicciones para 2020:

Still some improvements, prediction for 2020 (Ref. olibre's answer below)
-------------------------------------------------------------------------
   16 000 ns ( 16 µs) SSD random read (olibre's note: should be less)
  500 000 ns (  ½ ms) Round trip in datacenter
2 000 000 ns (  2 ms) HDD random read (seek)

In 2015 there are currently available:
========================================================================
      820 ns ( 0.8µs)     random read from a SSD-DataPlane
    1 200 ns ( 1.2µs) Round trip in datacenter
    1 200 ns ( 1.2µs)     random read from a HDD-DataPlane

Solo por el simple hecho de comparar el panorama de latencia de CPU y GPU:

No es una tarea fácil comparar incluso las alineaciones más simples de CPU / caché / DRAM (incluso en un modelo de acceso de memoria uniforme), donde la velocidad de DRAM es un factor para determinar la latencia y la latencia cargada (sistema saturado), donde este último gobierna y es algo que las aplicaciones empresariales experimentarán más que un sistema inactivo completamente descargado.

                    +----------------------------------- 5,6,7,8,9,..12,15,16 
                    |                               +--- 1066,1333,..2800..3300
                    v                               v
First  word = ( ( CAS latency * 2 ) + ( 1 - 1 ) ) / Data Rate  
Fourth word = ( ( CAS latency * 2 ) + ( 4 - 1 ) ) / Data Rate
Eighth word = ( ( CAS latency * 2 ) + ( 8 - 1 ) ) / Data Rate
                                        ^----------------------- 7x .. difference
******************************** 
So:
===

resulting DDR3-side latencies are between _____________
                                          3.03 ns    ^
                                                     |
                                         36.58 ns ___v_ based on DDR3 HW facts

Acceso uniforme a la memoria

Los motores de GPU han recibido una gran cantidad de marketing técnico, mientras que las profundas dependencias internas son claves para comprender tanto las fortalezas reales como las debilidades reales que experimentan estas arquitecturas en la práctica (generalmente muy diferentes a las expectativas agresivas de marketing agresivo).

   1 ns _________ LETS SETUP A TIME/DISTANCE SCALE FIRST:
          °      ^
          |\     |a 1 ft-distance a foton travels in vacuum ( less in dark-fibre )
          | \    |
          |  \   |
        __|___\__v____________________________________________________
          |    |
          |<-->|  a 1 ns TimeDOMAIN "distance", before a foton arrived
          |    |
          ^    v 
    DATA  |    |DATA
    RQST'd|    |RECV'd ( DATA XFER/FETCH latency )

  25 ns @ 1147 MHz FERMI:  GPU Streaming Multiprocessor REGISTER access
  35 ns @ 1147 MHz FERMI:  GPU Streaming Multiprocessor    L1-onHit-[--8kB]CACHE

  70 ns @ 1147 MHz FERMI:  GPU Streaming Multiprocessor SHARED-MEM access

 230 ns @ 1147 MHz FERMI:  GPU Streaming Multiprocessor texL1-onHit-[--5kB]CACHE
 320 ns @ 1147 MHz FERMI:  GPU Streaming Multiprocessor texL2-onHit-[256kB]CACHE

 350 ns
 700 ns @ 1147 MHz FERMI:  GPU Streaming Multiprocessor GLOBAL-MEM access
 - - - - -

Por lo tanto, comprender las internalidades es mucho más importante que en otros campos, donde se publican arquitecturas y numerosos puntos de referencia disponibles gratuitamente. Muchas gracias a los microprobadores de GPU, que han dedicado su tiempo y creatividad a dar rienda suelta a la verdad de los esquemas reales de trabajo dentro de los dispositivos de GPU probados de enfoque de caja negra.

    +====================| + 11-12 [usec] XFER-LATENCY-up   HostToDevice    ~~~ same as Intel X48 / nForce 790i
    |   |||||||||||||||||| + 10-11 [usec] XFER-LATENCY-down DeviceToHost
    |   |||||||||||||||||| ~  5.5 GB/sec XFER-BW-up                         ~~~ same as DDR2/DDR3 throughput
    |   |||||||||||||||||| ~  5.2 GB/sec XFER-BW-down @8192 KB TEST-LOAD      ( immune to attempts to OverClock PCIe_BUS_CLK 100-105-110-115 [MHz] ) [D:4.9.3]
    |                       
    |              Host-side
    |                                                        cudaHostRegister(   void *ptr, size_t size, unsigned int flags )
    |                                                                                                                 | +-------------- cudaHostRegisterPortable -- marks memory as PINNED MEMORY for all CUDA Contexts, not just the one, current, when the allocation was performed
    |                        ___HostAllocWriteCombined_MEM / cudaHostFree()                                           +---------------- cudaHostRegisterMapped   -- maps  memory allocation into the CUDA address space ( the Device pointer can be obtained by a call to cudaHostGetDevicePointer( void **pDevice, void *pHost, unsigned int flags=0 ); )
    |                        ___HostRegisterPORTABLE___MEM / cudaHostUnregister( void *ptr )
    |   ||||||||||||||||||
    |   ||||||||||||||||||
    |   | PCIe-2.0 ( 4x) | ~ 4 GB/s over  4-Lanes ( PORT #2  )
    |   | PCIe-2.0 ( 8x) | ~16 GB/s over  8-Lanes
    |   | PCIe-2.0 (16x) | ~32 GB/s over 16-Lanes ( mode 16x )
    |
    |   + PCIe-3.0 25-port 97-lanes non-blocking SwitchFabric ... +over copper/fiber
    |                                                                       ~~~ The latest PCIe specification, Gen 3, runs at 8Gbps per serial lane, enabling a 48-lane switch to handle a whopping 96 GBytes/sec. of full duplex peer to peer traffic. [I:]
    |
    | ~810 [ns]    + InRam-"Network" / many-to-many parallel CPU/Memory "message" passing with less than 810 ns latency any-to-any
    |
    |   ||||||||||||||||||
    |   ||||||||||||||||||
    +====================|
    |.pci............HOST|

Mi disculpa por una "imagen más grande", pero el exceso de latencia también tiene límites cardinales impuestos por las capacidades smREG / L1 / L2 en chip y las tasas de aciertos / errores.

    |.pci............GPU.|
    |                    | FERMI [GPU-CLK] ~ 0.9 [ns] but THE I/O LATENCIES                                                                  PAR -- ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| <800> warps ~~ 24000 + 3200 threads ~~ 27200 threads [!!]
    |                                                                                                                                               ^^^^^^^^|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [!!]
    |                                                       smREGs________________________________________ penalty +400 ~ +800 [GPU_CLKs] latency ( maskable by 400~800 WARPs ) on <Compile-time>-designed spillover(s) to locMEM__
    |                                                                                                              +350 ~ +700 [ns] @1147 MHz FERMI ^^^^^^^^
    |                                                                                                                          |                    ^^^^^^^^
    |                                                                                                                       +5 [ns] @ 200 MHz FPGA. . . . . . Xilinx/Zync Z7020/FPGA massive-parallel streamline-computing mode ev. PicoBlazer softCPU
    |                                                                                                                          |                    ^^^^^^^^
    |                                                                                                                   ~  +20 [ns] @1147 MHz FERMI ^^^^^^^^
    |                                                             SM-REGISTERs/thread: max  63 for CC-2.x -with only about +22 [GPU_CLKs] latency ( maskable by 22-WARPs ) to hide on [REGISTER DEPENDENCY] when arithmetic result is to be served from previous [INSTR] [G]:10.4, Page-46
    |                                                                                  max  63 for CC-3.0 -          about +11 [GPU_CLKs] latency ( maskable by 44-WARPs ) [B]:5.2.3, Page-73
    |                                                                                  max 128 for CC-1.x                                    PAR -- ||||||||~~~|
    |                                                                                  max 255 for CC-3.5                                    PAR -- ||||||||||||||||||~~~~~~|
    |
    |                                                       smREGs___BW                                 ANALYZE REAL USE-PATTERNs IN PTX-creation PHASE <<  -Xptxas -v          || nvcc -maxrregcount ( w|w/o spillover(s) )
    |                                                                with about 8.0  TB/s BW            [C:Pg.46]
    |                                                                           1.3  TB/s BW shaMEM___  4B * 32banks * 15 SMs * half 1.4GHz = 1.3 TB/s only on FERMI
    |                                                                           0.1  TB/s BW gloMEM___
    |         ________________________________________________________________________________________________________________________________________________________________________________________________________________________
    +========|   DEVICE:3 PERSISTENT                          gloMEM___
    |       _|______________________________________________________________________________________________________________________________________________________________________________________________________________________
    +======|   DEVICE:2 PERSISTENT                          gloMEM___
    |     _|______________________________________________________________________________________________________________________________________________________________________________________________________________________
    +====|   DEVICE:1 PERSISTENT                          gloMEM___
    |   _|______________________________________________________________________________________________________________________________________________________________________________________________________________________
    +==|   DEVICE:0 PERSISTENT                          gloMEM_____________________________________________________________________+440 [GPU_CLKs]_________________________________________________________________________|_GB|
    !  |                                                         |\                                                                +                                                                                           |
    o  |                                                texMEM___|_\___________________________________texMEM______________________+_______________________________________________________________________________________|_MB|
       |                                                         |\ \                                 |\                           +                                               |\                                          |
       |                                              texL2cache_| \ \                               .| \_ _ _ _ _ _ _ _texL2cache +370 [GPU_CLKs] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | \                                   256_KB|
       |                                                         |  \ \                               |  \                         +                                 |\            ^  \                                        |
       |                                                         |   \ \                              |   \                        +                                 | \           ^   \                                       |
       |                                                         |    \ \                             |    \                       +                                 |  \          ^    \                                      |
       |                                              texL1cache_|     \ \                           .|     \_ _ _ _ _ _texL1cache +260 [GPU_CLKs] _ _ _ _ _ _ _ _ _ |   \_ _ _ _ _^     \                                 5_KB|
       |                                                         |      \ \                           |      \                     +                         ^\      ^    \        ^\     \                                    |
       |                                     shaMEM + conL3cache_|       \ \                          |       \ _ _ _ _ conL3cache +220 [GPU_CLKs]           ^ \     ^     \       ^ \     \                              32_KB|
       |                                                         |        \ \                         |        \       ^\          +                         ^  \    ^      \      ^  \     \                                  |
       |                                                         |         \ \                        |         \      ^ \         +                         ^   \   ^       \     ^   \     \                                 |
       |                                   ______________________|__________\_\_______________________|__________\_____^__\________+__________________________________________\_________\_____\________________________________|
       |                  +220 [GPU-CLKs]_|           |_ _ _  ___|\          \ \_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \ _ _ _ _\_ _ _ _+220 [GPU_CLKs] on re-use at some +50 GPU_CLKs _IF_ a FETCH from yet-in-shaL2cache
       | L2-on-re-use-only +80 [GPU-CLKs]_| 64 KB  L2_|_ _ _   __|\\          \ \_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \ _ _ _ _\_ _ _ + 80 [GPU_CLKs] on re-use from L1-cached (HIT) _IF_ a FETCH from yet-in-shaL1cache
       | L1-on-re-use-only +40 [GPU-CLKs]_|  8 KB  L1_|_ _ _    _|\\\          \_\__________________________________\________\_____+ 40 [GPU_CLKs]_____________________________________________________________________________|
       | L1-on-re-use-only + 8 [GPU-CLKs]_|  2 KB  L1_|__________|\\\\__________\_\__________________________________\________\____+  8 [GPU_CLKs]_________________________________________________________conL1cache      2_KB|
       |     on-chip|smREG +22 [GPU-CLKs]_|           |t[0_______^:~~~~~~~~~~~~~~~~\:________]
       |CC-  MAX    |_|_|_|_|_|_|_|_|_|_|_|           |t[1_______^                  :________]
       |2.x   63    |_|_|_|_|_|_|_|_|_|_|_|           |t[2_______^                  :________] 
       |1.x  128    |_|_|_|_|_|_|_|_|_|_|_|           |t[3_______^                  :________]
       |3.5  255 REGISTERs|_|_|_|_|_|_|_|_|           |t[4_______^                  :________]
       |         per|_|_|_|_|_|_|_|_|_|_|_|           |t[5_______^                  :________]
       |         Thread_|_|_|_|_|_|_|_|_|_|           |t[6_______^                  :________]
       |            |_|_|_|_|_|_|_|_|_|_|_|           |t[7_______^     1stHalf-WARP :________]______________
       |            |_|_|_|_|_|_|_|_|_|_|_|           |t[ 8_______^:~~~~~~~~~~~~~~~~~:________]
       |            |_|_|_|_|_|_|_|_|_|_|_|           |t[ 9_______^                  :________]
       |            |_|_|_|_|_|_|_|_|_|_|_|           |t[ A_______^                  :________]
       |            |_|_|_|_|_|_|_|_|_|_|_|           |t[ B_______^                  :________]
       |            |_|_|_|_|_|_|_|_|_|_|_|           |t[ C_______^                  :________]
       |            |_|_|_|_|_|_|_|_|_|_|_|           |t[ D_______^                  :________]
       |            |_|_|_|_|_|_|_|_|_|_|_|           |t[ E_______^                  :________]
       |            |_|_|_|_|_|_|_|_|_|_|_|       W0..|t[ F_______^____________WARP__:________]_____________
       |            |_|_|_|_|_|_|_|_|_|_|_|         ..............             
       |            |_|_|_|_|_|_|_|_|_|_|_|           ............|t[0_______^:~~~~~~~~~~~~~~~\:________]
       |            |_|_|_|_|_|_|_|_|_|_|_|           ............|t[1_______^                 :________]
       |            |_|_|_|_|_|_|_|_|_|_|_|           ............|t[2_______^                 :________] 
       |            |_|_|_|_|_|_|_|_|_|_|_|           ............|t[3_______^                 :________]
       |            |_|_|_|_|_|_|_|_|_|_|_|           ............|t[4_______^                 :________]
       |            |_|_|_|_|_|_|_|_|_|_|_|           ............|t[5_______^                 :________]
       |            |_|_|_|_|_|_|_|_|_|_|_|           ............|t[6_______^                 :________]
       |            |_|_|_|_|_|_|_|_|_|_|_|           ............|t[7_______^    1stHalf-WARP :________]______________
       |            |_|_|_|_|_|_|_|_|_|_|_|           ............|t[ 8_______^:~~~~~~~~~~~~~~~~:________]
       |            |_|_|_|_|_|_|_|_|_|_|_|           ............|t[ 9_______^                 :________]
       |            |_|_|_|_|_|_|_|_|_|_|_|           ............|t[ A_______^                 :________]
       |            |_|_|_|_|_|_|_|_|_|_|_|           ............|t[ B_______^                 :________]
       |            |_|_|_|_|_|_|_|_|_|_|_|           ............|t[ C_______^                 :________]
       |            |_|_|_|_|_|_|_|_|_|_|_|           ............|t[ D_______^                 :________]
       |            |_|_|_|_|_|_|_|_|_|_|_|           ............|t[ E_______^                 :________]
       |            |_|_|_|_|_|_|_|_|_|_|_|       W1..............|t[ F_______^___________WARP__:________]_____________
       |            |_|_|_|_|_|_|_|_|_|_|_|         ....................................................
       |            |_|_|_|_|_|_|_|_|_|_|_|          ...................................................|t[0_______^:~~~~~~~~~~~~~~~\:________]
       |            |_|_|_|_|_|_|_|_|_|_|_|          ...................................................|t[1_______^                 :________]
       |            |_|_|_|_|_|_|_|_|_|_|_|          ...................................................|t[2_______^                 :________] 
       |            |_|_|_|_|_|_|_|_|_|_|_|          ...................................................|t[3_______^                 :________]
       |            |_|_|_|_|_|_|_|_|_|_|_|          ...................................................|t[4_______^                 :________]
       |            |_|_|_|_|_|_|_|_|_|_|_|          ...................................................|t[5_______^                 :________]
       |            |_|_|_|_|_|_|_|_|_|_|_|          ...................................................|t[6_______^                 :________]
       |            |_|_|_|_|_|_|_|_|_|_|_|          ...................................................|t[7_______^    1stHalf-WARP :________]______________
       |            |_|_|_|_|_|_|_|_|_|_|_|          ...................................................|t[ 8_______^:~~~~~~~~~~~~~~~~:________]
       |            |_|_|_|_|_|_|_|_|_|_|_|          ...................................................|t[ 9_______^                 :________]
       |            |_|_|_|_|_|_|_|_|_|_|_|          ...................................................|t[ A_______^                 :________]
       |            |_|_|_|_|_|_|_|_|_|_|_|          ...................................................|t[ B_______^                 :________]
       |            |_|_|_|_|_|_|_|_|_|_|_|          ...................................................|t[ C_______^                 :________]
       |            |_|_|_|_|_|_|_|_|_|_|_|          ...................................................|t[ D_______^                 :________]
       |            |_|_|_|_|_|_|_|_|_|_|_|          ...................................................|t[ E_______^                 :________]
       |            |_|_|_|_|_|_|_|_|_|_|_|tBlock Wn....................................................|t[ F_______^___________WARP__:________]_____________
       |
       |                   ________________          °°°°°°°°°°°°°°°°°°°°°°°°°°~~~~~~~~~~°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
       |                  /                \   CC-2.0|||||||||||||||||||||||||| ~masked  ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
       |                 /                  \  1.hW  ^|^|^|^|^|^|^|^|^|^|^|^|^| <wait>-s ^|^|^|^|^|^|^|^|^|^|^|^|^|^|^|^|^|^|^|^|^|^|^|^|^|^|^|^|^|^|^|^|^|^|^|^|^|
       |                /                    \ 2.hW  |^|^|^|^|^|^|^|^|^|^|^|^|^          |^|^|^|^|^|^|^|^|^|^|^|^|^|^|^|^|^|^|^|^|^|^|^|^|^|^|^|^|^|^|^|^|^|^|^|^|^
       |_______________/                      \______I|I|I|I|I|I|I|I|I|I|I|I|I|~~~~~~~~~~I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|
       |~~~~~~~~~~~~~~/ SM:0.warpScheduler    /~~~~~~~I~I~I~I~I~I~I~I~I~I~I~I~I~~~~~~~~~~~I~I~I~I~I~I~I~I~I~I~I~I~I~I~I~I~I~I~I~I~I~I~I~I~I~I~I~I~I~I~I~I~I~I~I~I~I
       |              \          |           //
       |               \         RR-mode    //
       |                \    GREEDY-mode   //
       |                 \________________//
       |                   \______________/SM:0__________________________________________________________________________________
       |                                  |           |t[ F_______^___________WARP__:________]_______
       |                                ..|SM:1__________________________________________________________________________________
       |                                  |           |t[ F_______^___________WARP__:________]_______
       |                                ..|SM:2__________________________________________________________________________________
       |                                  |           |t[ F_______^___________WARP__:________]_______
       |                                ..|SM:3__________________________________________________________________________________
       |                                  |           |t[ F_______^___________WARP__:________]_______
       |                                ..|SM:4__________________________________________________________________________________
       |                                  |           |t[ F_______^___________WARP__:________]_______
       |                                ..|SM:5__________________________________________________________________________________
       |                                  |           |t[ F_______^___________WARP__:________]_______
       |                                ..|SM:6__________________________________________________________________________________
       |                                  |           |t[ F_______^___________WARP__:________]_______
       |                                ..|SM:7__________________________________________________________________________________
       |                                  |           |t[ F_______^___________WARP__:________]_______
       |                                ..|SM:8__________________________________________________________________________________
       |                                  |           |t[ F_______^___________WARP__:________]_______
       |                                ..|SM:9__________________________________________________________________________________
       |                                ..|SM:A      |t[ F_______^___________WARP__:________]_______
       |                                ..|SM:B      |t[ F_______^___________WARP__:________]_______
       |                                ..|SM:C      |t[ F_______^___________WARP__:________]_______
       |                                ..|SM:D      |t[ F_______^___________WARP__:________]_______
       |                                  |_______________________________________________________________________________________
       */

¿La línea de fondo?

Cualquier diseño motivado de baja latencia tiene que aplicar ingeniería inversa al "sistema hidráulico de E / S" (ya que 0 1-XFER son incompresibles por naturaleza) y las latencias resultantes rigen el límite de rendimiento para cualquier solución GPGPU, ya sea computacionalmente intensivo ( leer : donde los costos de procesamiento están perdonando un poco más una XFER de baja latencia ...) o no ( léase : donde (puede ser para sorpresa de alguien) las CPU-s son más rápidas en el procesamiento de extremo a extremo, que las telas de GPU [citas disponibles] )

usuario3666197
fuente
77
He intentado entender tu respuesta. Parece muy interesante, pero los gráficos ASCII no son fáciles de leer debido a las limitaciones de alto / ancho. Lo siento, no sé cómo podría mejorarse esto ... Finalmente, me falta un resumen (al final, no sé qué pensar sobre las latencias de CPU frente a GPU). Espero que pueda mejorar su respuesta para proporcionar una mejor apariencia visual y una comprensión humana. Valor. Saludos :-D
olibre
3

Mire este diagrama de "escalera", que ilustra perfectamente diferentes tiempos de acceso (en términos de tics de reloj). Observe que la CPU roja tiene un "paso" adicional, probablemente porque tiene L4 (mientras que otros no).

Gráficos de tiempos de acceso con diferentes jerarquías de memoria.

Tomado de este artículo de Extremetech.

En informática se llama "complejidad de E / S".

Persona Oskar
fuente