Beruflich Dokumente
Kultur Dokumente
COMPUTACIÓN UNIFICADA
La moderna unidad de procesamiento de gráficos 3D (GPU) ha evolucionado desde una tubería
de gráficos de función fija a un procesador paralelo programable con una potencia de cálculo
superior a la de las CPU multinúcleo. Las tuberías de gráficos tradicionales constan de etapas
programables separadas de procesadores de vértices que ejecutan programas de sombreado de
vértices y procesadores de fragmentos de píxeles que ejecutan programas de sombreado de
píxeles. (Montrym y Moreton proporcionan antecedentes adicionales sobre la arquitectura
tradicional del procesador de gráficos).
En este artículo, discutimos los requisitos que impulsaron la arquitectura del procesador de
cómputo en paralelo y gráficos unificados, describen la arquitectura de Tesla y cómo se permite
la implementación generalizada de aplicaciones informáticas y gráficas paralelas.
Los procesadores vértices operan en los vértices de primitivos como puntos, líneas y triángulos.
Las operaciones típicas incluyen la transformación de coordenadas en espacio de pantalla, que
luego se alimentan a la unidad de configuración y el rasterizador, y la configuración de los
parámetros de iluminación y textura para ser utilizados por los procesadores pixelfragment. Los
procesadores de fragmentos de píxel funcionan en la salida de rasterizador, que llena el interior
de las primitivas, junto con los parámetros interpolados. Los procesadores Vertex y fragmentos
de píxeles han evolucionado a diferentes velocidades: los procesadores Vertex se diseñaron para
operaciones matemáticas de baja latencia y alta precisión, mientras que los procesadores de
fragmentos de píxeles se optimizaron para filtrado de texturas de baja latencia y alta latencia.
Los procesadores Vertex tradicionalmente han admitido un procesamiento más complejo, por
lo que primero se pueden programar. Durante los últimos seis años, los dos tipos de
procesadores han convergido funcionalmente como resultado de la necesidad de una mayor
generalización de programación. Sin embargo, la mayor generalidad también aumentó la
complejidad del diseño, el área y el costo del desarrollo de dos procesadores por separado.
Debido a que las GPU generalmente deben procesar más píxeles que vértices, los procesadores
de fragmentos de píxeles superan tradicionalmente a los procesadores de vértices en
aproximadamente tres a uno. Sin embargo, las cargas de trabajo típicas no están bien
equilibradas, lo que conduce a la ineficiencia. Por ejemplo, con triángulos grandes, los
procesadores de vértices están en su mayoría inactivos, mientras que los procesadores de
píxeles están completamente ocupados. Con triángulos pequeños, lo opuesto es verdad. La
adición de procesamiento primitivo más complejo en DX10 hace que sea mucho más difícil
seleccionar una relación de procesador fijo. Todos estos factores influyeron en la decisión de
diseñar una arquitectura unificada.
Un objetivo de diseño primario para Tesla era ejecutar programas de sombreado de vértice y
fragmento de píxel en la misma arquitectura de procesador unificado. La unificación permitiría
el equilibrio de carga dinámico de cargas de trabajo de procesamiento de vértices y píxeles
variables y permitiría la introducción de nuevas etapas de sombreado de gráficos, como
sombreadores de geometría en DX10. También permitió que un solo equipo se centrara en
diseñar un procesador rápido y eficiente, y permitió compartir hardware costoso, como las
unidades de textura. La generalidad requerida de un procesador unificado abrió la puerta a una
capacidad de computación paralela de GPU completamente nueva. La desventaja de esta
generalidad fue la dificultad del equilibrio de carga eficiente entre diferentes tipos de
sombreadores. Otros requisitos críticos de diseño de hardware fueron la escalabilidad
arquitectónica, el rendimiento, la potencia y la eficiencia del área. Los arquitectos de Tesla
desarrollaron las características gráficas establecidas en coordinación con el desarrollo de la API
de gráficos Microsoft Direct3D DirectX 10. Desarrollaron las funciones de computación de la GPU
en coordinación con el desarrollo del lenguaje de programación paralelo CUDA C, el compilador
y las herramientas de desarrollo.
Arquitectura Tesla
La arquitectura de Tesla se basa en una matriz de procesadores escalable. La Figura 1 muestra
un diagrama de bloques de una GPU GeForce 8800 con 128 núcleos de procesador de
transmisión (SP) organizados como 16 multiprocesadores de transmisión (SM) en ocho unidades
de procesamiento independientes denominadas clústeres de textura / procesador (TPC). El
trabajo fluye de arriba hacia abajo, comenzando en la interfaz del host con el bus PCIExpress del
sistema. Debido a su diseño de procesador unificado, la arquitectura física de Tesla no se
asemeja al orden lógico de las etapas de las tuberías de gráficos. Sin embargo, usaremos el flujo
de la tubería de gráficos lógicos para explicar la arquitectura. En el nivel más alto, la matriz de
procesadores de flujo escalable de la GPU (SPA) realiza todos los cálculos programables de la
GPU. El sistema de memoria escalable consiste en control de DRAM externo y procesadores de
operación de ráster de función fija (ROP) que realizan operaciones de búfer de cuadros de color
y profundidad directamente en la memoria. Una red de interconexión conlleva valores
calculados de fragmentos de píxeles y valores de profundidad desde el SPA hasta los ROP. La red
también enruta solicitudes de lectura de memoria de textura del SPA a DRAM y lee datos de
DRAM a través de un caché de nivel 2 de vuelta al SPA.
Los bloques restantes en la Figura 1 entregan trabajo de entrada al SPA. El ensamblador de
entrada recoge el trabajo de vértice como lo indica el flujo de comandos de entrada. El bloque
de distribución de trabajo de vértice distribuye los paquetes de trabajo de vértice a los diversos
TPC en el SPA. Los TPC ejecutan programas de sombreado de vértices y (si están habilitados)
programas de sombreado de geometría. Los datos de salida resultantes se escriben en búferes
en chip. Estos búferes pasan luego sus resultados al bloque viewport / clip / setup / raster / zcull
para rasterizarlos en fragmentos de píxeles. La unidad de distribución de trabajo de píxeles
distribuye fragmentos de píxeles a los TPC apropiados para el procesamiento de fragmentos de
píxeles. Los pixelfragments sombreados se envían a través de la red de interconexión para su
procesamiento por unidades de profundidad y color ROP. El bloque de distribución de trabajo
de cálculo distribuye conjuntos de subprocesos de cálculo a los TPC. El SPA acepta y procesa el
trabajo para múltiples flujos lógicos simultáneamente. Múltiples dominios de reloj para
unidades de GPU, procesadores, DRAM y otras unidades permiten optimizaciones de potencia
y rendimiento independientes.
Figura 1. Arquitectura unificada de GPU de gráficos e informática de Tesla. TPC: grupo textura / procesador; SM:
multiprocesador de transmisión; SP: procesador de transmisión; Tex: textura, ROP: procesador de operación raster.
Procesamiento de comandos
La unidad de interfaz de host GPU se comunica con la CPU del host, responde a los comandos
de la CPU, obtiene datos de la memoria del sistema, verifica la consistencia del comando y realiza
el cambio de contexto. El ensamblador de entrada recoge primitivas geométricas (puntos, líneas,
triángulos, franjas de línea y tiras de triángulos) y recupera datos de atributos de entrada de
vértices asociados. Tiene tasas pico de una primitiva por reloj y ocho atributos escalares por reloj
en el reloj central de la GPU, que normalmente es de 600 MHz. Las unidades de distribución de
trabajo envían la secuencia de salida del ensamblador de entrada a la matriz de procesadores,
que ejecutan los programas de vértice, geometría y sombreado de píxeles, así como programas
informáticos. Las unidades de distribución de trabajo de vértices y cómputo entregan trabajo a
los procesadores en un esquema round-robin. La distribución del trabajo de píxeles se basa en
la ubicación del píxel.
Controlador de geometría
El controlador de geometría mapea la tubería de vértices de gráficos lógicos en la recirculación
en los SM físicos al dirigir todos los atributos de primitiva y de vértice y el flujo de topología en
el TPC. Gestiona el almacenamiento de atributos de vértice de entrada y salida de onchip
dedicado y reenvía los contenidos según sea necesario.
DX10 tiene dos etapas relacionadas con el procesamiento de vértices y primitivos: el
sombreador de vértices y el sombreador de geometría. El sombreador de vértices procesa los
atributos de un vértice independientemente de otros vértices. Las operaciones típicas son las
transformaciones del espacio de posición y la generación de coordenadas de color y textura. El
sombreador de geometría sigue el sombreador de vértices y trata con una primitiva completa y
sus vértices.
Las operaciones típicas son la extrusión de bordes para la generación de sombra de stencil y la
generación de texturas de mapas en cubo. Las primitivas de salida de shader de geometría van
a etapas posteriores para clipping, transformación de ventana gráfica y rasterización en
fragmentos de píxeles.
Streaming multiprocesador
El SM es un multiprocesador unificado de gráficos y computación que ejecuta programas de
sombreado de vértice, geometría y fragmento de píxel y programas informáticos paralelos.
Como se muestra en la Figura 3, el SM consta de ocho núcleos de procesador de transmisión
(SP), dos unidades de función especial (SFU), unidad de búsqueda y emisión de instrucción
multiproceso (MT Issue), un caché de instrucción, un caché constante de solo lectura y un 16 -
Kbyte leer / escribir memoria compartida.
Cada núcleo SP contiene una unidad escalar de multiplicidad (MAD), lo que le da al SM ocho
unidades MAD. El SM utiliza sus dos unidades SFU para funciones trascendentales e
interpolación de atributos: la interpolación de atributos de píxeles a partir de atributos de
vértices que definen una primitiva. Cada SFU también contiene cuatro multiplicadores de coma
flotante. El SM utiliza la unidad de textura TPC como una tercera unidad de ejecución y utiliza
las unidades SMC y ROP para implementar la carga de memoria externa, la tienda y los accesos
atómicos. Una red de interconexión de baja latencia entre los SP y los bancos de memoria
compartida proporciona acceso a memoria compartida.
La GeForce 8800 Ultra sincroniza los SP y unidades SFU a 1.5 GHz, para un pico de 36 Gflops por
SM. Para optimizar la potencia y la eficiencia del área, algunas unidades de SM que no son de
datos operan a la mitad de la velocidad del reloj SP.
Instrucción única, múltiples hilos. Para administrar y ejecutar cientos de subprocesos que
ejecutan varios programas diferentes de manera eficiente, el Tesla SM utiliza una nueva
arquitectura de procesador que llamamos instrucción única, múltiples hilos (SIMT). La unidad de
instrucción SMT multiproceso de SM crea, gestiona, programa y ejecuta hilos en grupos de 32
hilos paralelos llamados warps. El término urdimbre se origina en el tejido, la primera tecnología
de hilo en paralelo. La Figura 4 ilustra la programación SIMT. El tamaño de warp SIMT de 32
subprocesos paralelos proporciona eficiencia en abundantes subprocesos de píxel de grano fino
y subprocesos informáticos.
Cada SM maneja un grupo de 24 warps, con un total de 768 hilos. Los subprocesos individuales
que componen un warpe SIMT son del mismo tipo y comienzan juntos en la misma dirección de
programa, pero son libres de ramificarse y ejecutarse de forma independiente. En cada tiempo
de emisión de instrucción, la unidad de instrucción multiproceso de SIMT selecciona una
deformación que está lista para ejecutarse y emite la siguiente instrucción a los hilos activos de
dicha urdimbre. Una instrucción SIMT se transmite sincrónicamente a los hilos paralelos activos
de una urdimbre; hilos individuales pueden estar inactivos debido a una ramificación o
predicación independiente.
El SM asigna los hilos de urdimbre a los núcleos SP, y cada subproceso se ejecuta de forma
independiente con su propia dirección de instrucción y estado de registro. Un procesador SIMT
obtiene una eficacia y un rendimiento completos cuando los 32 hilos de un warp toman la misma
ruta de ejecución. Si los hilos de una urdimbre divergen a través de una rama condicional
dependiente de datos, la urdimbre ejecuta en serie cada ruta de ramificación tomada,
deshabilita los hilos que no están en esa ruta y cuando todas las rutas se completan, los hilos
vuelven a la ruta de ejecución original. El SM usa una pila de sincronización de sucursales para
administrar hilos independientes que divergen y convergen. La divergencia de ramas solo ocurre
dentro de una disformidad; diferentes warps se ejecutan independientemente
independientemente de si están ejecutando rutas de código comunes o disjuntas. Como
resultado, las GPU de arquitectura de Tesla son mucho más eficientes y flexibles en el código de
bifurcación que las GPU de generación anterior, ya que sus deformaciones de 32 hilos son
mucho más estrechas que el ancho SIMD de las GPU anteriores.
La arquitectura SIMT es similar al diseño de una sola instrucción, datos múltiples (SIMD), que
aplica una instrucción a múltiples carriles de datos. La diferencia es que SIMT aplica una
instrucción a múltiples hilos independientes en paralelo, no solo múltiples carriles de datos. Una
instrucción SIMD controla un vector de múltiples carriles de datos y expone el ancho del vector
al software, mientras que una instrucción SIMT controla la ejecución y el comportamiento de
ramificación de un hilo.
A diferencia de las arquitecturas vectoriales SIMD, SIMT permite a los programadores escribir
código en paralelo de nivel de hilo para hilos independientes, así como código paralelo de datos
para hilos coordinados. Para la corrección del programa, los programadores pueden ignorar
esencialmente los atributos de ejecución de SIMT como warps; sin embargo, pueden lograr
mejoras sustanciales en el rendimiento al escribir código que rara vez requiere que los hilos en
una urdimbre diverjan. En la práctica, esto es análogo al papel de las líneas de caché en los
códigos tradicionales: los programadores pueden ignorar el tamaño de la línea de caché al
diseñar de forma correcta, pero deben considerarlo en la estructura del código al diseñar para
un rendimiento máximo. Las arquitecturas de vectores SIMD, por otro lado, requieren que el
software combine manualmente las cargas en vectores y gestione la divergencia manualmente.
Las operaciones de coma flotante y entero incluyen agregar, multiplicar, agregar multiplicación,
mínimo, máximo, comparar, establecer predicado y conversiones entre números enteros y de
coma flotante. Las instrucciones de punto flotante proporcionan modificadores de operandos
fuente para la negación y el valor absoluto. Las instrucciones de funciones trascendentales
incluyen coseno, seno, exponencial binario, logaritmo binario, recíproco y raíz cuadrada
recíproca. Las instrucciones de interpolación de atributos proporcionan una generación
eficiente de atributos de píxeles. Los operadores bit a bit incluyen desplazamiento a la derecha,
operadores lógicos y movimiento. El flujo de control incluye la ramificación, la llamada, el
retorno, la trampa y la sincronización de barrera.
Las instrucciones de punto flotante y entero también pueden establecer indicadores de estado
por subproceso para cero, negativo, acarreo y desbordamiento, que el programa de subprocesos
puede usar para la bifurcación condicional.
Para satisfacer las necesidades informáticas y del lenguaje C / C ++, Tesla SM implementa
instrucciones de carga / almacenamiento de memoria además de la obtención de texturas de
gráficos y la salida de píxeles. Las instrucciones de carga / almacenamiento de memoria usan el
direccionamiento de bytes enteros con aritmética de direcciones de registro más
desplazamiento para facilitar las optimizaciones de código de compilador convencionales.
memoria local para datos temporales por hilo, privados (implementados en DRAM
externa);
memoria compartida para acceso de baja latencia a datos compartidos por hilos
cooperantes en el mismo SM; y
memoria global para datos compartidos por todos los hilos de una aplicación
informática (implementada en DRAM externa).
Las operaciones de agregar y multiplicar usan IEEE redondear a la más cercana, incluso como el
modo de redondeo predeterminado. La operación de suma y multiplicación realiza una
multiplicación con truncamiento, seguida de un complemento con tono-redondo-redondo-par.
El SP descarga los operandos de origen denormal a los cero y signos de inundación con signo
que producen un subdesbordamiento del rango del exponente de salida objetivo al cero con
signo conservado después del redondeo.
Controlador SM. El SMC controla múltiples SM, arbitrando la unidad de textura compartida, la
ruta de carga / almacenamiento y la ruta de E / S. El SMC sirve tres cargas de trabajo de gráficos
simultáneamente: vértice, geometría y píxel. Encapsula cada uno de estos tipos de entrada en
el ancho de urdimbre, inicia el procesamiento del sombreador y desempaqueta los resultados.
Cada tipo de entrada tiene rutas de E / S independientes, pero el SMC es responsable del
equilibrio de carga entre ellas. El SMC admite el equilibrio de carga estático y dinámico en
función de las asignaciones recomendadas por el controlador, las asignaciones actuales y la
dificultad relativa de la asignación de recursos adicionales. El equilibrio de carga de las cargas de
trabajo fue uno de los problemas de diseño más desafiantes debido a su impacto en la eficiencia
general del SPA.
Unidad de textura
La unidad de textura procesa un grupo de cuatro hilos (vértice, geometría, píxel o cómputo) por
ciclo. Las fuentes de instrucciones de textura son coordenadas de textura, y las salidas son
muestras filtradas, generalmente un color de cuatro componentes (RGBA). La textura es una
unidad separada externa al SM conectado a través del SMC. El subproceso SM emisor puede
continuar la ejecución hasta que se detenga una dependencia de datos.
Cada unidad de textura tiene cuatro generadores de dirección de textura y ocho unidades de
filtro, para una tasa máxima de GeForce 8800 Ultra de 38.4 gigabilerps / s (un bilerp es una
interpolación bilineal de cuatro muestras). Cada unidad admite filtrado anisotrópico 2: 1 a
velocidad completa, así como filtrado de formato de datos de coma flotante de 16 bits y 32 bits
de rango dinámico (HDR) de alta velocidad. La unidad de textura está profundamente
canalizada. Aunque contiene un caché para capturar la localidad de filtrado, transmite éxitos
mezclados con fallas sin estancamiento.
Rasterización
Las primitivas de geometría que salen de los SM van en su orden de entrada de round-robin
original al bloque viewport / clip / setup / raster / zcull. La ventana gráfica y las unidades de clip
recortan las primitivas a la vista estándar trunco y a cualquier plano de clip de usuario habilitado.
Transforman los vértices de recorte en el espacio de la pantalla (píxel) y rechazan las primitivas
completas fuera del volumen de la vista, así como las primitivas de la parte posterior.
Las primitivas que sobreviven se dirigen a la unidad de configuración, que genera ecuaciones de
borde para el rasterizador. Las ecuaciones de los planos de los atributos también se generan
para la interpolación lineal de los atributos de los píxeles en el sombreador de píxeles. Una etapa
de fragmentación gruesa genera todos los mosaicos de píxeles que están al menos parcialmente
dentro de la primitiva.
La unidad zcull mantiene una superficie z jerárquica, rechazando las fichas de píxeles si se sabe
que están ocluidas de manera conservadora por los píxeles dibujados previamente. La tasa de
rechazo es de hasta 256 píxeles por reloj. La pantalla se subdivide en azulejos; cada TPC procesa
un subconjunto predeterminado. La dirección del mosaico de píxeles selecciona, por lo tanto, el
TPC de destino. Las fichas de píxeles que sobreviven a zcull pasan a una etapa de
finerasterización que genera información de cobertura detallada y valores de profundidad para
los píxeles.
OpenGL y Direct3D requieren que se realice una prueba de profundidad después de que el
sombreador de píxeles haya generado los valores finales de color y profundidad. Cuando es
posible, para ciertas combinaciones de estado de API, la GPU de Tesla realiza la prueba de
profundidad y la actualización antes del sombreador de fragmentos, posiblemente guardando
miles de ciclos de tiempo de procesamiento, sin violar la semántica ordenada por API.
El SMC ensambla los píxeles supervivientes en urdimbres para ser procesados por un SM que
ejecuta el sombreador de píxeles actual. Cuando el sombreado de píxeles haya finalizado, los
píxeles se probarán en profundidad si esto no se hizo antes del sombreador. El SMC luego envía
los píxeles supervivientes y los datos asociados al ROP.
Cada partición de memoria tiene 64 bits de ancho y admite DDR2 de velocidad de datos doble y
protocolos GDDR3 orientados a gráficos a hasta 1 GHz, produciendo un ancho de banda de
alrededor de 16 Gbytes / s.
El soporte Antialiasing incluye hasta 163 multisampling y supersampling. Los formatos HDR son
totalmente compatibles. Ambos algoritmos admiten 1, 2, 4, 8 o 16 muestras por píxel y generan
un promedio ponderado de las muestras para producir el color de píxel final. Multisampling
ejecuta el sombreador de píxeles una vez para generar un color compartido por todas las
muestras de píxeles, mientras que el supermuestreo ejecuta el sombreador de píxeles una vez
por muestra. En ambos casos, los valores de profundidad se evalúan correctamente para cada
muestra, según sea necesario para la interpenetración correcta de primitivas.
Debido a que la multimuestreo ejecuta el sombreador de píxeles una vez por píxel (en lugar de
una vez por muestra), la multimuestreo se ha convertido en el método antialiasing más popular.
Más allá de cuatro muestras, sin embargo, el costo de almacenamiento aumenta más rápido de
lo que mejora la calidad de la imagen, especialmente con formatos HDR. Por ejemplo, una única
superficie de 1.600 3 1.200 píxeles, que almacena 16 muestras de coma flotante de 16 bits de
cuatro componentes, requiere 1.600 3 1.200 3 16 3 (64 bits de color + 32 bits de profundidad) 5
368 Mbytes.
Para la gran mayoría de los píxeles de borde, dos colores son suficientes; lo que importa es más
información de cobertura detallada. El algoritmo de antialiasing de muestreo de cobertura
(coverage-sampling antialiasing, CSAA) proporciona muestras de bajo costo por cobertura, lo
que permite escalar hacia arriba. Al computar y almacenar la cobertura booleana en hasta 16
muestras y comprimir el color y la profundidad redundante y la información de la plantilla en la
huella de memoria y el ancho de banda de cuatro u ocho muestras, se puede lograr la calidad
de antialiasing a 43 en el rendimiento de antialiasing. CSAA es compatible con las técnicas de
representación existentes, incluidos los algoritmos HDR y stencil. Los bordes definidos por la
intersección de polígonos interpenetrantes se renderizan a la calidad de conteo de muestras
almacenadas (43 u 83). La Tabla 2 resume los requisitos de almacenamiento de los tres
algoritmos.
Memoria e interconexión
El ancho del bus de datos de la memoria DRAM es de 384 pines, dispuestos en seis particiones
independientes de 64 pines cada una. Cada partición posee 1/6 del espacio de direcciones
físicas. Las unidades de partición de memoria encuestan directamente las solicitudes. Arbitran
entre cientos de solicitudes en vuelo desde las etapas paralelas de los gráficos y las tuberías de
cálculo. El arbitraje busca maximizar la eficiencia total de transferencia de DRAM, lo que
favorece la agrupación de solicitudes relacionadas por el banco de DRAM y la dirección de
lectura / escritura, al tiempo que se minimiza la latencia en la medida de lo posible. Los
controladores de memoria admiten una amplia gama de frecuencias de reloj DRAM, protocolos,
densidades de dispositivos y anchos de bus de datos.
Red de interconexión Una única unidad concentradora enruta las solicitudes a la partición
adecuada desde los solicitantes no paralelos (PCI-Express, host y comando front-end,
ensamblador de entrada y pantalla). Cada partición de memoria tiene sus propias unidades ROP
de profundidad y color, por lo que el tráfico de la memoria ROP se origina localmente. Sin
embargo, las solicitudes de textura y carga / almacenamiento pueden ocurrir entre cualquier
TPC y cualquier partición de memoria, por lo que una red de interconexión enruta solicitudes y
respuestas.
Una CTA consta de 1 a 512 subprocesos concurrentes, y cada subproceso tiene una Id. De
subproceso único (TID), numerados del 0 al m. El programador declara la forma y las
dimensiones de CTA 1D, 2D o 3D en hilos. El TID tiene índices de una, dos o tres dimensiones.
Los hilos de una CTA pueden compartir datos en la memoria global o compartida y pueden
sincronizarse con la instrucción de barrera. Los programas de subprocesos CTA utilizan sus TID
para seleccionar el trabajo y el índice de matrices de datos compartidos. Las TID
multidimensionales pueden eliminar las operaciones de dividir y restar enteros al indexar
matrices.
Cada SM ejecuta hasta ocho CTA al mismo tiempo, dependiendo de las demandas de recursos
de CTA. El programador o compilador declara la cantidad de hilos, registros, memoria
compartida y barreras requeridas por el programa CTA. Cuando un SM tiene suficientes recursos
disponibles, el SMC crea el CTA y asigna números TID a cada hilo. El SM ejecuta los subprocesos
CTA simultáneamente como SIMT warps de 32 subprocesos paralelos.
Figura 6. Niveles de granularidad anidada: hilo (a), matriz de hilos cooperativos (b) y cuadrícula (c). Estos tienen
los niveles correspondientes de uso compartido de memoria: subprocesos locales, compartidos por CTA y global
por aplicación.
Cuadrículas de CTA
Para implementar el bloque de grano grueso y la descomposición de la cuadrícula de la Figura
5, la GPU crea CTA con números exclusivos de identificación de CTA y de cuadrícula. El
distribuidor de trabajo de cómputo equilibra dinámicamente la carga de trabajo de GPU
distribuyendo una secuencia de trabajo de CTA a SM con suficientes recursos disponibles.
Para permitir que un programa binario compilado se ejecute sin cambios en GPU grandes o
pequeñas con cualquier cantidad de procesadores SM paralelos, los CTA se ejecutan de forma
independiente y calculan bloques de resultados independientemente de otros CTA en la misma
cuadrícula. Los pasos de aplicación secuencialmente dependientes se asignan a dos cuadrículas
dependientes secuencialmente. La grilla dependiente espera a que se complete la primera grilla;
luego, las CTA de la grilla dependiente leen los bloques de resultados escritos por la primera
grilla.
Granularidad paralela
La Figura 6 muestra los niveles de granularidad paralela en el modelo de computación GPU. Los
tres niveles son
Los niveles más altos de paralelismo utilizan múltiples GPU por CPU y clústeres de nodos multi-
GPU.
local: cada subproceso que se ejecuta tiene una memoria local privada por subproceso
para el desbordamiento de registro, el marco de pila y las variables temporales
direccionables;
compartido: cada CTA en ejecución tiene una memoria compartida por CTA para
acceder a los datos compartidos por hilos en la misma CTA;
Las grillas secuenciales globales se comunican y comparten grandes conjuntos de datos
en la memoria global.
Los hilos que se comunican en una CTA utilizan la instrucción de sincronización de barrera rápida
para esperar que las escrituras en la memoria compartida o global se completen antes de leer
los datos escritos por otros hilos en la CTA. El sistema de memoria de carga / almacenamiento
utiliza un orden de memoria relajado que conserva el orden de las lecturas y escrituras en la
misma dirección desde el mismo subproceso emisor y desde el punto de vista de los subprocesos
de CTA que coordinan con la instrucción de sincronización de barrera. Las cuadrículas
dependientes secuencialmente utilizan una barrera de sincronización intergrid global entre
cuadrículas para garantizar el orden global de lectura / escritura.
Escalado transparente de la computación GPU
El paralelismo varía ampliamente en el rango de productos de GPU desarrollados para varios
segmentos del mercado. Una GPU pequeña puede tener un SM con ocho núcleos SP, mientras
que una GPU grande puede tener muchos SM que sumen cientos de núcleos SP.
La Figura 7 muestra un programa CUDA que ejecuta una serie de núcleos paralelos en un sistema
de CPU-GPU heterogéneo. KernelA y KernelB se ejecutan en la GPU como cuadrículas de los
bloques de hilos nBlkA y nBlkB (CTA), que ejemplifican los hilos de nTidA y nTidB por CTA.
CUDA extiende C / C ++ con las palabras clave especificadoras de declaración __global__ para
funciones de entrada de kernel, __device__ para variables globales y __shared__ para variables
de memoria compartida. El texto de un núcleo CUDA es simplemente una función C para un hilo
secuencial. Las variables incorporadas threadIdx. {X, y, z} y el bloque Idx. {X, y, z} proporcionan
el ID del hilo dentro de un bloque de hilos (CTA), mientras que el bloque Idx proporciona el ID
de CTA dentro de una cuadrícula. La función extendida llama a la sintaxis kernel <<<nBlocks,
nThreads>>> (args); activa una función de kernel paralelo en una grilla de nBlocks, donde cada
bloque instancia nThreads hilos concurrentes, y args son argumentos ordinarios para funcionar
kernel ().
Figura 7. Secuencia del programa CUDA del kernel A seguida del kernel B en un sistema heterogéneo de CPU-GPU.
Escalabilidad y rendimiento
La arquitectura unificada de Tesla está diseñada para la escalabilidad. Variar el número de SM,
TPC, ROP, cachés y particiones de memoria proporciona la combinación adecuada para
diferentes objetivos de rendimiento y costo en los segmentos de valor, mainstream, entusiastas
y profesionales del mercado. La interconexión de enlace escalable (SLI) de NVIDIA permite que
múltiples GPU actúen juntas como una, proporcionando una mayor escalabilidad.
Figura 9. Diseño de matriz GeForce 8800 Ultra
Las aplicaciones CUDA C / C ++ que se ejecutan en las plataformas informáticas Tesla, las
estaciones de trabajo Quadro y las GPU GeForce brindan un rendimiento informático
convincente en una amplia gama de problemas, que incluyen más de 1003 aceleraciones en
modelado molecular, más de 200 Gflops en problemas con n cuerpos y real tiempo de
resonancia magnética 3D. Para los gráficos, la GPU GeForce 8800 ofrece un alto rendimiento y
calidad de imagen para los juegos más exigentes.
La Figura 9 muestra el diseño de matriz física GeForce 8800 Ultra que implementa la arquitectura
de Tesla que se muestra en la Figura 1. Los detalles de implementación incluyen