(NVIDIA) GPU Arch

Presenter Notes

Tres conceptos claves de la arquitectura GPU

Presenter Notes

Tres conceptos claves

  1. Muchos núcleos simples que corren en paralelo.
  2. Empaquetar muchos cores y que corran el mismo flujo de instrucciones.
    • SIMD implícito.
    • Instrucciones escalares, el hardware "vectoriza".
  3. Entremezclar hilos en un solo core para evitar stalls: ocultamiento de latencia.

    • De memoria.
    • De operaciones largas.
  4. Kayvon Fatahalian, From Shader Code to a Teraflop: How GPU Shader Cores Work, 2011.

Presenter Notes

Muchos núcleos simples: shader core

1 shader

Presenter Notes

Comparación con CPU

Shader vs CPU

CPU baja latencia de un hilo a costa del throughput.
El trabajo puede ser secuencial o paralelo.

GPU tiene alta latencia, pero alto thoroughput.
Asume trabajo en paralelo.

Presenter Notes

Muchos shaders

16 shaders

Se usa el área de la caché, branch prediction, scheduler (OoOE), prefetcher, etc.

Presenter Notes

Muchos shaders, comparten instrucciones

sharing instruction stream

Amortizar aun más el área de Fetch/Decode:
SIMD adentro de la GPU.

Presenter Notes

Hard SIMD no implica soft SIMD

  • SSE/AVX/AVX-512: hw SIMD, sw SIMD.
    • Hay que hacerlo a mano con blend e instrucciones con máscara.
  • GPU: hw SIMD, sw MIMD.
    • Grupos de ALUs comparten instruction stream.
    • NVIDIA: warp, grupos de 32 hilos.
    • ATI: wavefront, grupos de 64 hilos.

¿Cómo lo hace?: internal masks, branch syncronization stack, instruction markers.
W.Fung, I.Sham, G.Yuan, T.Aamodt, Dynamic Warp Formation and Scheduling for Efficient GPU Control Flow, MICRO40, 2007.

Ilusión de que cada hilo tiene su propio PC

Writing programs that operate on SIMD Lanes in this highly independent MIMD mode is like writing programs that use lots of virtual address space on a computer with a smaller physical memory. Both are correct, but they may run so slowly that the programmer could be displeaced with the result.

Hennessy, Patterson, CAAQA5, p.303.

Presenter Notes

Ejecución condicional

Presenter Notes

Muchos hilos para ocultar latencia

Latency hiding

Presenter Notes

Muchos hilos para ocultar latencia

Cambio de contexto es prácticamente gratis.

Pero tengo que poder almacenar el contexto (PC, regs, flags) en algún lugar muy cercano.

Tensión entre:

  • tamaño del contexto
  • capacidad de ocultar la latencia.

Ejemplo

Cada SM (streaming multiprocessor) de Volta o Turing tiene 65536 registros de 32 bits, o sea 256 KiB.

Presenter Notes

Máximo ocultamiento de latencia

Context size and latency

Presenter Notes

Mínimo ocultamiento de latencia

Context size and latency

Presenter Notes

Si hacemos todo bien

Tesla P100 del 2016:

  • 28 TPC.
  • 4 SM per TPC
  • 32 lanes per SM.
  • 1 FMA precisión double por lane (2 floating point ops).
  • 1.328 GHz clock frequency.

(28×4)×32×1.328 = 4.759 TFLOPS precisión doble

Ojo también tiene "Turbo Boost" 4760 - 5304 MHz

Tesla V100 del 2017:

(21×4)×64×1455 = 7.822 TFLOPS precisión doble

Presenter Notes

Jerarquía de Memoria

Presenter Notes

Estilo CPU

CPU memory hierarchy

El nudo está en la caché.

Presenter Notes

Estilo GPU

GPU memory hierarchy

Elimina la caché, pero da 6x de ancho de banda de memoria.

Presenter Notes

Estilo GPU moderno

Modern GPU memory hierarchy

Agrega caché manual (shared memory), caché L1 y caché L2.
¡Cuiadado! La caché tiene propósitos distintos que en la CPU.

Presenter Notes

Jerarquía piramidal invertida

GF100

Registros: 128 KiB × 15 ~= 2 MiB
Caché L1: [16 KiB × 15, 48 KiB × 15 ] ~= [0.25 MiB, 0.75 MiB]
Caché L2: 0.75 MiB

GV104

Registros: 256 KiB × 84 ~= 21 MiB
Caché L1: 128KiB × 84 ~= 10 MiB
Caché L2: 6 MiB

Presenter Notes

Intensidad aritmética y performance pico

Ejemplo, C2075

  • 1 TFLOPS
  • 150 GBps

Necesito 1024GFLOP / (150GBps/4) = 27 FLOP/word (operaciones de punto flotante por lectura de fp32).

¡Intensidad aritmética desmesurada!

Presenter Notes

Memoria: throughput y latencia

  • Registros: 8.1 TB/s, 1 ciclo.
  • Shared: 1.6 TB/s, ~6 ciclos.
  • Principal: 150 GB/s, ~200,400 ciclos.

Para comparar

  • Una instrucción FMA toma entre 18 y 22 ciclos.
  • Ancho de banda de PCIe 3.0 x16 15.75 GB/s.

Presenter Notes

Arquitectura Detallada

Presenter Notes

Recordemos Pollack's Rule

Microprocessor (single core) performance scales roughly as the square root of its complexity, where transistor count is often used as a proxy to quantify complexity.

(M. Själander, M. Martonosi, S. Kaxiras, Power-Efficient Computer Architectures, Synthesis Lectures on Computer Architecture, 2014)

Presenter Notes

En el otro extremo de la regla de Pollack

Ejemplo de la arquitectura bit.LITTLE de ARM

Las GPUs son muchísimos núcleos pequeños

  • Gran throughput.
  • pero con Gran latencia.

Presenter Notes

Arquitectura general

  • Muchos núcleos.
  • Caché L2.
  • Memoria paralela.

Ali Bakhoda et.al, Analyzing CUDA Workloads Using a Detailed GPU Simulator, ISPASS, 2009.

Presenter Notes

Detalles

  • Comunicación de programas y datos a través de PCIe. Es un acelerador u offloader.
  • Muchos núcleos, del orden de decenas.
  • Todos los núcleos ejecutan en mismo programa.
  • Entre 2 y 8 canales de comunicación de memoria.
  • Memoria global entre 0.5 GiB y 16 GiB, 32 GiB, 48 GiB!!.
  • La red de interconexión de las memorias intenta maximizar el paralelismo. No hay necesariamente una localidad.
  • Los memory controllers juntan pedidos de memoria y cuando están listos avisan a los cores (async access).

Presenter Notes

Arquitectura de un (shader) core, aka SM

Ali Bakhoda et.al, Analyzing CUDA Workloads Using a Detailed GPU Simulator, ISPASS, 2009.

Presenter Notes

Tipos de memoria

Además de la memoria global que pueden ver todos los cores, hay memoria local.

Memoria constante / de parámetros ~64 KiB

Caché L1 read-only, broadcast a todas las ALUs si piden el mismo dato.

Memoria de texturas ~128 KiB compartida con L1 y shared.

Caché L1 read-only, con un interleaving para que las lecturas espaciales sean óptimas con el 4D blocking scheme.

Presenter Notes

Tipos de memoria

Memoria local / Cache L1 (total 128 KiB)

Caché L1 non-coherent de memoria global. Write policy depende de si es memoria local o global.

... evict-on-write for global memory, writeback for local memory ...

http://gpgpu-sim.org/manual/index.php/Main_Page#L1_Data_Cache

Memoria compartida (total 128 KiB)

Memoria de lecto-escritura tipo scratchpad highly-banked (32-way) para lecturas paralelas y broadcast para lecturas al mismo banco.

http://www.3dgep.com/optimizing-cuda-applications/

Presenter Notes

Cómo se ejecuta

 1 #define N (1<<28)
 2 #define BLOCK_SIZE 128
 3 
 4 __device__ float a[N], b[N], c[N], d[N];
 5 
 6 __global__ void ma4(void) {
 7     unsigned int gtid = blockIdx.x*blockDim.x + threadIdx.x;
 8     d[gtid] = a[gtid]*b[gtid]+c[gtid];
 9 }
10 
11 int main(void)
12 {
13     ma4<<<N/BLOCK_SIZE, BLOCK_SIZE>>>();
14     cudaDeviceSynchronize();
15     return 0;
16 }

Presenter Notes

Planificación local

  • El mismo código para todas las ALUs del shader core.
  • Átomo: paquetes de 32 lanes: warp.
  • Agrupan átomos en blocks.
  • 1 block (varios warps) -> 1 core.
  • 1 core -> varios blocks.

Planificador local (por core)

  1. Elegir circularmente (round robin) un warp listo para ejecutar de algún bloque.
  2. Se lo corre ininterrumpidamente hasta terminar o ...
  3. Si hay una dependencia no resuelta, switch de banco de registros (zero overhead).
  4. GOTO 1

Barrera

Un bloque llamando a bar.sync hace que todos los warps del block sincronicen en esa instrucción.

Presenter Notes

Planificador global

Asigna blocks a SM mientras HAYA LUGAR.

Hay lugar si no se supera (Volta)

  • Cantidad de bloques por SM: 16
  • Cantidad de warps por SM: 32
  • Cantidad de registros por SM: 65536
  • Cantidad de memoria compartida por SM: 64 KiB

Multiprogramación

Algunas arquitecturas aceptan bloques de kernels distintos que ejecuten en el mismo SM.

Ejecutar dos o más programas distintos en los mismos SM.

Presenter Notes

Unidades de Cómputo

ALU

Operaciones de enteros y fp32.
En igual cantidad.
Throughput 1.

LD/ST

Unidades de pedido de memoria. En cantidad menor a ALU.

ALU fp64

Menor cantidad que fp32.
Acá está el ratio fp64/fp32 = {1/2, 1/8, 1/32} dependiendo de la arquitectura.

SFU

Operaciones trascendentales: sin, cos, log2, exp2, rcp, sqrt, rsqrt. En mucho menor cantidad que los dos anteriores.

TEX

Unidades de interpolación de texturas. Cantidad similar a SFU.

Presenter Notes

Regla de Little

Si tengo una latencia de 20 ciclos para una instrucción típica y una ALU de 32 de ancho.
¿Cuántos warps necesito para tener un throughput de 32 IPC?

http://www.nvidia.com/content/gtc-2010/pdfs/2238_gtc2010.pdf

Paralelismo = latencia × throughput
640 = 20 × 32

¡Un montón de paralelismo!
(no necesariamente TLP, también puede ser ILP)

Presenter Notes

Aprovechar BW de memoria

Todos los pedidos de memoria de un warp se juntan para armar un pedido grande.

http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#compute-capability-3-0

Permutation crossbar de 32x4=128 bytes.

Presenter Notes

Arquitectura Volta

Presenter Notes

Arquitectura Volta Comparación

Presenter Notes

Arquitectura Volta Arquitectura

Presenter Notes

Volta Streaming Multiprocessor

Presenter Notes

Volta SM detail

Presenter Notes

Volta Independent Thread Scheduling

Pre Volta

Volta

Presenter Notes