Interconexión GPU y Arquitecturas Paralelas

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.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.