Download Arquitectura de una GPU

Document related concepts
no text concepts found
Transcript
GPU: Arquitectura
Clase 3
Pasado
CPU monoprocesador...
capacidad limitada, a la vez
que las aplicaciones cada vez
necesitan más velocidad de
procesamiento y recursos
para atender dichas
demandas.
En vez de aumentar la
capacidad en el chip del
procesador → se agregan
más cores → paralelismo.
Arquitecturas multicores:
CPUs con 2 o más cores. Se
incorporan más nucleos para
acelerar las aplicaciones
existentes.
Presente
Arquitecturas many cores:
GPUs con cientos y miles de
cores.
Optimizan el desempeño
de las aplicaciones.
A partir del año 2009 la diferencia de las
velocidades para ambas arquitecturas es
de 10 a 1 (GPU-CPU)
¿Por qué esta diferencia tan grande?
La respuesta está en las distintas filosofías de diseño...
Multicores: mejorar desempeño
de soluciones secuenciales.
Many cores: optimizar el
throughput de muchos threads
ejecutando en paralelo.
En las GPUs, la mayor parte de la arquitectura está dedicada a cómputo y
no a técnicas para disminuir la latencia.
Cómo se logran las mejoras?
CPU: optimización del código secuencial.
GPU: optimización de código paralelo.
En las GPUs, la mayor parte de la arquitectura está dedicada a cómputo y
no a técnicas para disminuir la latencia.
Las optimizaciones de las arquitecturas multicore son hechas para proveer
mejor desempeño a las soluciones secuenciales, por ejemplo:
- proveer lógica de control compleja para la ejecución paralela de código secuencial
- incluir memorias caché más rápidas y más grandes para disminuir la
latencia de las instrucciones.
En las GPUs, la mayor parte de la arquitectura está dedicada a cómputo y
no a técnicas para disminuir la latencia.
En GPU se busca optimizar el throughput de muchos cores ejecutando en
paralelo:
- si un core está esperando por al finalización de una operación, se le asigne
trabajo y no permanece ocioso..
- las memorias caché son pequeñas, ayudan a mantener el ancho de banda
definido para todos los threads paralelos.
La mayor parte de la arquitectura está dedicada a cómputo y no a
técnicas para disminuir la latencia.
Otro punto de discrepancia: ancho de banda de la memoria
Las GPUs mantienen la diferencia
de ancho de banda 10 veces
superior a CPU
El ancho de banda de CPU está
compartido por todas las aplicaciones,
operacions de E/S, funciones del
SO coexistentes en el sistema, etc.
GPUs son diseñadas como computadoras especializadas
para cómputo numérico.
CPU para operaciones secuenciales.
Contar con una arquitectura de trabajo híbrida permite
aprovechar las ventajas de CPU y de GPU.
Podemos aprovechar las
ventajas de cada tipo de
sistema.
Desde el HPC: es necesario conocer las características del hardware:
para aprovechar sus ventajas,
evitar posibles penalizaciones por sus propias caracaterísticas .
Arquitectura de ejemplo: Fermi GF100 (año 2010)
●
●
●
●
Dispone de 512 cores CUDA:
● dividios en 16 Streaming
Multiprocessor (SM)
6GB de DRAM (en 6 pariticiones)
Host interface: conecta a CPU
via PCI-express
El GigaThread global scheduler
distribuye bloques a los SM
thread scheduler.
Fuente:
L Fermi GF100 GPU arquitecture by Craig Wittenbrink, Emmet Kilgariff, Arjun Prabhu. IEEE Computer Society
2. GF100 White Paper. NVIDIA.
CUDA es una arquitectura de hardware y software que permite
ejecutar programas en placas gráficas de NVIDIA.
:
Memoria local
de thread
Memoria
compartida
de bloque
Un thread de un bloque ejecuta una
instancia de un kernel. Tiene su propio id
dentro de su bloque, su propio PC,
registros, memoria privada, entradas y
salidas.
Un bloque es un conjunto de threads
concurrentes que pueden cooperar
entre ellos, sincronizarse y comparten
memoria. Un bloque tiene su propio id
dentro del grid.
Grid 1
Block Block Block
(0,0) (1,0) (2,0)
Memoria
global
Grid 2
Block
(0,0)
Block
(1,0)
Block Block
(0,1) (1,1)
Una grilla es un arreglo de bloques de
threads que ejecutan el mismo kernel,
leen entradas desde memoria global,
escriben resultados en memoria global,
y se sincronizan entre otras llamadas a
kernels.
CUDA es una arquitectura de hardware y software que permite
ejecutar programas en placas gráficas de NVIDIA.
:
La jerarquía de threads de
CUDA se mapea con una
jerarquía de procesadores
de la GPU:
●
Grid 1
●
Block Block Block
(0,0) (1,0) (2,0)
●
Grid 2
●
Block
(0,0)
Block
(1,0)
Block Block
(0,1) (1,1)
Una GPU ejecuta una o más grilla de
kernels.
Un Streaming Processor (SM) ejecuta
uno o más bloques de threads.
Un Core CUDA (y otras unidades de
ejecución) en el SM ejecutan
threads.
Los SM ejecutan grupos de 32
threads llamados warps.
Arquitectura de ejemplo: Fermi GF100 (año 2010)
Streaming Multiprocessor
Arquitectura de ejemplo: Fermi GF100 (año 2010)
Streaming Multiprocessor
●
Cada SM tiene:
●
Naranja: scheduler y dispatch
●
Verde: unidades de ejecución
●
Azul: file registers y cache L1
●
Fermi GF100 dispone de 512 cores CUDA
organizados en 16 SM de 32 cores cada uno.
●
Un core CUDA ejecuta una instrucción
de thread (punto flotante o entero)
por ciclo de reloj.
●
Cada core tiene una unidad entera
Aritmético lógica (ALU) y una unidad
de punto flotante (FPU).
–
Las unidades enteras soportan varias instrucciones:
boolean, shift, move, compare, convert, etc.
●
LOAD / STORE units: permiten
calcular direcciones de datos
origen o destino para 16
threads por ciclo de reloj.
Se almacenan o cargan los datos
de cada dirección en cache o DRAM.
●
Las Special Function Units (SFUs) ejecutan
instrucciones transcendentales como sin,
cos, inversa, raices cuadradas. Cada SFU
ejecuta una instrucción por thread, por ciclo
de reloj: un warp ejecuta en 8 clocks.
La planificación de las SFU se desacopla de
la dispatch unit, permitiendo que esta misma
planifique las otras unidades de ejecución mientras
las SFUs están ocupadas.
●
Dual Warp Scheduler
–
Cada SM incluye dos Warp Schedulers y dos Instruction Dispatch Units
lo que permite que dos warps se puedan ejecutar de forma concurrente.
–
Se selecciones 2 warps y se toman una instrucción de cada uno. Esta
instrucción se distribuye a un grupo de 16 cores, 16 load/store units,
o 4 SFUs.
–
Las ejecuciones de los warps son independientes. Casi todas las operaciones
pueden ser “repartidas” de a dos: dos instrucciones int, 2 instrucciones
floating point o mezcla de int, floating point, load, store, y SFU instructions
(excepto operaciones en doble precisión).