Interconexión GPU
PCI: Compartido para todo el sistema (paralelo). PCI-X: mejoras al PCI: 32 64bits.
AGP: bus exclusivo gráficos. PCI-Express: simétrico y full duplex.
Interfaces de salida
VGA: • Analógico pero señal se convierte D/A->A/D – DVI (Digital Video Interface) – HDMI– DisplayPort: • Competencia HDMI, royalty más barato, v1.2 hasta 21 Gbps, menor distancia de transporte sin pérdidas (~3m DP vs ~10m HDMI), 1.4 soporta HDR.
Tipos de paralelismo
·Bit-level, instruction: Bajo nivel, compilador, arq.
Paralelismo de datos: Operaciones sobre varios datos simultáneos. Si datos independientes->Muy automático-> Escalabilidad!
Paralelismo de tareas: Varias tareas simultáneamente. Tareas arbitrarias->Menos automático-> menos escalable. Tareas bien definidas-> Más automático-> ej. Segmentación Pipeline. Task (tarea, proceso): entidad de más alto nivel. Diferentes tareas tienen diferentes fines y en general no necesitan comunicarse entre ellas. Thread (hilo): para llevar a cabo una tarea, ésta se puede dividir en múltiples hilos. Todos los hilos colaboran para cumplir una misma tarea, y para ello necesitan compartir información y comunicarse.
Arquitecturas paralelas
Taxonomía de Flynn (Single/Multiple Instruction/Data)
SIMD sobre PC: Paralelismo a nivel de datos. Típico en arq de mem compartida->Único espacio de memoria, varios procesadores o núcleos.
MIMD: Multicores, multiprocesador, arq distribuidas-> Paralelismo a nivel de datos y de tareas. Arq en red, clusters.
Modelo de cómputo general en GPU
Streams – Texturas GPU = Arrays CPU
Kernels – Fragment program GPU = bucles internos CPU. El cómputo sobre datos en un array se traduce en la aplicación de un fragment program sobre una textura.
Procesamiento multipasada – Renderizar a textura (RTT) es básico para conseguir realimentación (offscreen rendering pBuffers, FBO, RB).
Ejecución de cómputo – Rasterización: genera todas las coordenadas de textura y es la forma de ejecutar el shader sobre los datos expuestos en la textura.
Dominio computacional: Coord de fragm/texturas.
Rango computacional: Coord de vértices. Son responsables del número de fragmentos en la salida.
Reducciones: Para calcular resultados globales sobre un stream es necesario operar sobre todos los datos de la colección.
1. Cargar datos en memoria de vídeo – Texturas (~arrays de datos)
2. Primitiva QUAD (obsoleta) del tamaño del viewport paralelo a cámara – Importante para mapear cada dato del array a fragmento creado.
3. Habilitar cauce alternativo a pipeline fijo->Shader ·Vertex o Fragment? • Texturas accesibles desde el fragment shader • Antes de arquitectura unificada->Más procesadores preparados • Más sencillo el control de salida – Shader actúa como kernel.
4. Renderizar
5. Descargar resultados a memoria principal y/o realimentar
—OPENGL: GPGPU
Preparar datos en CPU. Copiar datos de entrada de CPU a GPU y preparar datos de salida. Crear geometría. Programar kernel. Reanderizar a FBO. Copiar resultados de CPU a GPU. Usar resultados en CPU.
GPGPU – Programación de propósito general en GPU mediante contextos gráficos
GPU computing – Programación de propósito general mediante un interfaz de acceso a GPU sin contexto gráfico • Facilita el acceso a desarrolladores fuera del ámbito de los gráficos 3D – Favorece la abstracción y la implementación de patrones de diseño paralelos para su ejecución en GPU – Mucho poder de cómputo en hardware para continuar con un enfoque encorsetado en el mundo de la creación de gráficos 3D.
Memoria en CUDA
Global Memory: Memoria de GPU principal. Se puede comunicar con memoria principal del host a través de PCI-e. De gran capacidad. Acceso con alta latencia. Visible por todos los bloques de un grid.
Thread: La arquitectura masivamente paralela ofrece gran cantidad de procesadores para cómputo. Cada procesador computa mediante un hilo de ejecución. Cada hilo puede crear variables locales y accesibles durante su vida. Son variables declaradas dentro del kernel, no visibles desde código CPU.
Thread block: Hilos de cómputo se organizan en bloques.
Grid: Bloques de hilos se organizan en rejillas/mallas.
Memoria compartida (shared memory) – On-chip memory • Muy rápida y de baja latencia (2 órdenes de magnitud comparada con memoria global) • Mayor ancho de banda que memoria global (1 orden de magnitud) – Sólo común y visible por bloque • Permite cooperación entre hilos del bloque • Mecanismos de sincronización de barrera (a través de __syncthreads() ) – Mucho menor tamaño que memoria global. No es visible desde CPU aunque puede solicitar su reserva desde código CPU y pasarlo como tercer parámetro a la invocación del kernel. Entre hilos: accesos extremadamente rápidos. Interesante si hay que hacer muchos accesos a una porción de memoria. ¡sólo para comunciar threads de un mismo bloque!
Memoria textura – Actualmente denominada Read-Only Cache – Memoria global pero se cachea – Optimizado para lecturas 2D (texture fetch) – Métodos de interpolación y filtrado.
Memoria constante – Región especial de la memoria – Sólo lectura – Alojada en memoria global pero cacheada – Transferible desde host mediante cudaMemcpyToSymbol()
Todos los hilos de un grid de bloques ejecutan un kernel
¿Por qué dividir en bloques el grid? – Por escalabilidad: arquitectura basada en un array de Streaming Multiprocessors (SM) – Dependiendo de la familia de GPU cada SM tiene un número variable de Scalar Processors (SP) • Scalar Processors (SP) = CUDA Cores.