Fermi

De Codepixel

Fermi es el nombre de la nueva arquitectura CUDA de NVIDIA.

Contenido

[editar] Características

El chip está formado por 16 celdas de stream (Streaming Multiprocessor) con 32 cores por celda, con un total de 512 cores, diseñado para ejecutar una enorme cantidad de tareas en paralelo. En total son 3.000M de transistores.

Los programas de la GPU se denominan kernels. Un kernel se ejecuta en un grid de bloques de threads. Cada thread dentro del bloque de threads ejecuta una instancia del kernel, y tiene asignado su propio id de thread, que utiliza para acceder a un conjunto de datos. Un bloque de threads es un conjunto de threads que se colaboran entre sí, usando sistema de control como barreras, y memoria compartida, para realizar el trabajo del kernel. Un grid es un conjunto de bloques de threads, que lee datos de la memoria principal y devuelve los resultados. De este modo, los threads disponen de memoria local, los thread blocks disponen de memoria compartida, y los grid usan la memoria global. La ejecución en paralelo se gestiona en el controlador GigaThread, que puede gestionar hasta 1.536 threads simultaneamente.

[editar] Streaming Multiprocessor

Cada bloque de threads se divide en "warps" de 32 threads, que es la unidad mínima de gestión. Cada SM tiene 2 unidades para gestionar warps, con lo que se pueden enviar 2 warps a cada SM en cada ciclo. El gestor de warps envia las instrucciones a los cores para ejecutar así 32 instrucciones en paralelo.

Los 32 cores del SM no tienen registros, a diferencia de los procesadores normales, ni unidades de traducción de direcciones, etc. Deja todo esto al SM. Los cores son unidades muy simples que pueden cambiar de thread de forma extremadamente rápida.

Cada core del SM tiene una unidad simple de coma flotante que permite pipeline, otra para los enteros, una parte de lógica, un dispacher y una cola de resultados. Todos ellos comparten una zona de memoria especial, a modo de registros locales, de 4kb, que reside en el SM.

Cada SM dispone de 16 unidades de load/store, con lo que se pueden calcular direcciones de memoria para 16 threads de forma concurrente. Los cores usan estas unidades para acceder a los datos exernos al SM.

Para acelerar los cálculos de coma flotante, en cada SM se incluyen 4 procesadores especiales para operaciones complejas, como seno, coseno, etc, denominado Special Function Units (SFUs). Al sacarlos de los cores, el diseño de estos es todavía más sencillo.

[editar] Memoria y Caché

Para acceder a la RAM de la tarjeta, se dispone de seis particiones de 64bits, en un interfaz de 384bits, dando una capacidad máxima de 6Gb de memoria DDR5 en la tarjeta.

Se incluyen comprobaciones de fallos de escritura (Error checking and correction) que en general hacen el sistema más estable.

Para acceder a la memoria global del sistema, se usa un path a memoria de tipo "enlace PCI-Express bidirecional", consiguiendo los 12Gb/sec, frente a los 3GB/sec que lograba el anterior path unidireccional.

El chip tiene 1Mb de caché, repartida en grupos de 64Kb, y 768Kb de caché unificada de nivel 2. Esto es un gran avance, ya que anteriormente, las GPUs no disponian de caché para sus cálculos. La arquitectura de caché L1 permite dividir los 64k de cada procesador stream en 2 zonas, una es caché normal, y otra es un local scrachpad (48k cache, 16k local, o viceversa). La idea es que la memoria scrachpad es una memoria que está al mismo nivel que la caché en cuanto a velocidad, pero es controlable por la aplicación (tiene instrucciones propias para escribir en ella), y está pensada como una zona de memoria temporal para cálculos que no se copian a la ram global. Con esto evitamos problemas de contención (muchas celdas escribiendo en el bus de datos). Esta capacidad de poder configurar la forma en que funciona la memoria local, tendrá que ser explorado en el futuro, sobre todo por el compilador.

[editar] Operaciones Float

Es el primer chip en soportar el nuevo standard de coma flotante IEEE 754-2008, que incluye la operación "fused-multiply-add" (a+b*c en una operación), y soporte para float en 16bits nativo (el half usado en imágenes hdr). El rendimiento general de double se ha mejorado notablemente (entre 8X y 10X más rápidos).

[editar] Programación

Se ha mejorado el set de instucciones, de tal forma que se podrán desarrollar compiladores genéricos, para C++, OpenCL, DirectCompute, etc. Según la información de NVIDIA, el chip ha sido especialmente optimizado para OpenCL y DirectCompute (quizás reconociendo que este será el futuro de las API's). En concreto, permite a los compiladores optimizar el layout de memoria de los arrays, algo que hace que estas APIs ganen en rendimiento.

Las instrucciones ahora son predicadas, eliminando la necesidad de diferentes ramas de ejecución para secuencias de código.

El chip dispone de 64bits para el tamaño virtual de memoria, gracias a un nuevo juego de instrucciones. Los punteros de memoria ahora son unificados. Esto es, ya no existen distintos tipos de memoria enlos kernels, con espacios de memoria distintos. Los 64bits ahora permiten mapear todos los tipos de memoria de la GPU (en programas compilados para la GPU).

Las operaciones atómicas, usadas para el control de bloqueos entre threads, se han optimizado, y ahora son entre un 5X y un 20X más rápidas.

Los cambios de contexto en la ejecución son más rápidos, unos 25ms entre programas Además, se puede ejecutar un kernel, mientras otro está comunicándose con el bus principal de datos. La ventaja es que se puede cambiar varias veces de kernel en cada frame, evitando así los problemáticos übershaders.

Hay posibilidades de depuración como en los procesadores normales: breakpoints, single step, traps, etc. Con ello se facilita enormemente la programación de estas arquitecturas. Este es un cambio crucial, ya que se espera poder depurar CUDA directamente en el depurador del visual studio para GPUs.

[editar] Problemas

Todavía dispone de una reducida memoria para cada celda, limitando mucho los programas que se pueden ejecutar.

No es posible mapear la memoria de la GPU directamente, con lo que se pierde mucho tiempo enviado los datos a la GPU desde el programa principal. Además, la ley de Amdahl nos dice que si una parte de un proceso paralelo es lento, todo el programa se limitará a este proceso.

[editar] Enlaces

Herramientas personales