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