# Fermi (arquitectura)

Fermi és el nom que identifica una arquitectura de GPU desenvolupada per Nvidia com a successora de l'arquitectura Tesla. Va ser usada a les sèries GeForce 400 i GeForce 500. També va compartir sèrie amb la seva predecessora Kepler, a les GeForce 600, GeForce 700 i GeForce 800. La tecnologia de fabricació de les GPUs Fermi va ser de 40 nm per a les versions d'escriptori, i de 40 nm i 28 nm per a les versions mòbils. Es van comercialitzar dues generacions, la GF100 i la GF104.

## Característiques

Les principals característiques de l'arquitectura Fermi són les següents:
* 3 miliards de transistors (o 3 bilions amb l'escala curta)
* 512 nuclis CUDA, repartits entre 16 SMs (Streaming Multiprocessors) de 32 nuclis cada un
* Cada nucli CUDA pot executar una instrucció entera o de coma flotant per cicle d'un thread
* Té sis particions de memòria de 64 bits, per tant, una interfície amb memòria de 384 bits. En total, pot gestionar 6 GB de memòria GDDR5
* Amplada de banda de la DRAM: 192 GB/s
* Rendiment pic: 1.5 TFLOPS
* La connexió de la GPU i la CPU és via PCIe
* El planificador global GigaThread distribueix thread blocks entre els planificadors locals de cada SM

## Streaming Multiprocessor de tercera generació

Es tracta d'un innovador SM programable i eficient.
Cada nucli CUDA consta d'una ALU i d'una FPU. A més, implementa l'estàndard de coma flotant IEEE 754-2008. També disposa de la instrucció FMA (fused multiply-add), que realitza una multiplicació i una suma amb un arrodoniment final. Per altra banda, l'ALU suporta 32 bits per a totes les seves instruccions.
Es disposen 16 unitats load/store per a poder efectuar l'adreçament a memòra per a 16 threads a cada cicle.
També hi ha 4 unitats de funcions especials (SFU), com poden ser calcular un sinus o un cosinus. Una SFU calcula una operació per thread i cicle.
Una de les millores més rellevants d'aquesta arquitectura és la seva implementació per a suport de coma flotant doble. Amb la segona versió de Tesla (GT200), tot i també suportar coma flotant doble, el rendiment de Fermi és 4x més ràpid.
Per altra banda, disposa d'un planificador de warps dual. Un warp és un grup de 32 threads paral·lels, els quals l'SM planifica conjuntament. També disposa de 2 unitats de dispatch d'instruccions, per tant, es poden planificar i executar dos instruccions de warps diferents concurrentment, les quals es poden enviar a un grup de 16 nuclis, 16 unitats de load/store o a les 4 unitats SFU.
Respecte a la memòria de l'SM, disposa d'un xip de 64 KB programable. També es disposa d'un banc de registres de 32768 registres de 32 bits cada un.

## Parallel Thread Execution ISA de segona generació

Fermi és la primera arquitectura que suporta el conjunt d'instruccions Parallel Thread eXecution (PTX) 2.0. PTX és una màquina virtual de baix nivell i un ISA que permet suportar instruccions de processadors de threads paral·lels. Per tal de fer-ne ús, en el moment que s'instal·la l'aplicació, les instruccions PTX són traduïdes pel driver de la GPU a instruccions màquina. Degut a l'ús de PTX, la programabilitat de la GPU augmenta, així com l'eficiència i la precisió. Les característiques de PTX a remarcar són: espai d'adreces unificats per a variables i punters, adreçament de 64 bits, noves instruccions per a OpenCL i DirectCompute, instruccions de coma flotant IEEE de 32 bits, i donar suport complet al llenguatge C++.

## Jerarquia de memòria

L'arquitectura Fermi, usa el sistema NVIDIA Parallel DataCache, el qual té la cau L1 configurable i la cau L2 unificada. Cada SM disposa d'un xip de memòria programable per a memòria compartida o cau L1, els quals es poden distribuir entre 16 KB de memòria compartida i 48 KB de cau L1 o viceversa. Aquest disseny està pensat pels diferents tipus d'aplicacions, ja que tenen comportaments diferents. S'hi poden realitzar accessos load i store.
Per altra banda, el següent nivell de jerarquia és la cau L2, la qual està unificada per a tots els SMs i permet servir totes les operacions, és a dir, load, store i textures.
L'últim nivell de la jerarquia és la memòria DRAM.
Fermi és la primera GPU a incorporar Error Correcting Code (ECC) per tal de protegir les dades. Si troba que un bit de memòria ha estat modificat, el corregeix. Aquesta tecnologia s'ha aplicat a tots els nivells de la jerarquia de memòria.
Les operacions atòmiques s'han millorat per tal de fer-les més ràpides que la seva antecessora, la GT200. Concretament, són 20x més ràpides.

## Planificador de threads GigaThread

Cada Streaming Multiprocessor disposa d'un planificador de threads. Malgrat això, Fermi disposa d'una planificació de 2 nivells, ja que en té un altre a nivell global per a tots els SMs, el GigaThread. La primera versió d'aquest es va usar a la G80 (primera versió de Tesla), el qual podia gestionar fins a 12288 threads en temps real. Aquesta nova versió pot gestionar més threads, el canvi de context és més ràpid, suporta execució concurrent de kernels d'una mateixa aplicació i es millora la planificació de thread blocks.

## Referències

* ↑ NVIDIA Solves the GPU Computing Puzzle (anglès)
* ↑ NVIDIA's Next Generation CUDA Compute Aechitecture: Fermi, p. 8. (anglès)
* ↑ Precision & Performance: Floating Point and IEEE 754 Compliance for NVIDIA GPUs (anglès)
* ↑ NVIDIA’s Fermi: The First Complete GPU Computing Architecture (anglès)
* ↑ NVIDIA's Next Generation CUDA Compute Aechitecture: Fermi, p. 15. (anglès)
* ↑ The Top 10 Innovations in the New NVIDIA Fermi Architecture, and the Top 3 Next Challenges (anglès)
* ↑ NVIDIA's Next Generation CUDA Compute Aechitecture: Fermi, p. 18. (anglès)
Viccionari