# AMD FireStream

AMD Firestream è una tecnologia sviluppata da ATI, creata per sfruttare lo stream processing/GPGPU (General Purpose computation using GPU) per pesanti computazioni sui numeri in virgola mobile utili a numerose applicazioni, come la High Performance Computing (HPC), di natura scientifica, e di natura finanziaria.
Questa tecnologia era precedentemente un brand sia di ATI che di AMD, e fu chiamata rispettivamente ATI FireStream e AMD Stream Processor. Una scheda AMD Firestream può essere inoltre usata come un coprocessore capace di eseguire operazioni in virgola mobile atte a diminuire il carico di lavoro della CPU, che è parte anche dell'iniziativa Torrenza, prodotta sempre dalla stessa AMD.

## Descrizione

Fin dalla pubblicazione della generazione passata di GPU Radeon R520 e GeForce 7, il rendimento dell'architettura Shader programmabile con grandi numeri in virgola mobile ha avuto molte attenzioni dai gruppi commerciali e accademici, principalmente per la loro abilità nel processare dati oltre il loro uso originale di rendering di effetti visuali. Grazie al loro potenziale, molte risorse sono state investite nello sviluppo di prodotti GPGPU - responsabili di calcoli generali di formule matematiche - per processare pesanti calcoli che prima erano eseguiti nei server mainstream, CPU desktop, e specializzati coprocessori di numeri in virgola mobile. Le GPGPU sono proiettate nell'avere in futuro performance 10 volte superiori a parità di input rispetto a software eseguiti solo dalla CPU.
GPGPU simili sono apparse anche nel 2000. BionicFX sperimentò come processare dati audio con una GeForce 6008, annunciando il framework Audio Video EXchange (AVEX), con performance simili a quelle ATI. Un altro esempio è il Folding@Home, un programma di ricerca dalla Stanford University. Questo è stato il primo software a usare la GPU Radeon R580 e altre GPU ATI, equipaggiate con una speciale versione beta dei driver Catalyst (versione 6.5), e a eseguire operazioni computazionali slegate dalla grafica. Dal maggio 2006, le GPU sono state usate per accelerare la simulazione del ripiegamento di proteine per investigare sulle malattie relative alle proteine. In questo periodo, la ATI è stata inattiva a pianificare gli sviluppi futuri.
Il 15 novembre con l'acquisizione della ATI completa, AMD annuncia ufficialmente la ricostruzione del marchio e annuncia la AMD Stream Processor (originariamente nota come ATI FireStream), divenendo così la prima industria a fornire soluzioni hardware di questo tipo. Basato sulla Radeon X1900, la Stream Processor di AMD è una scheda specializzata che implementa la GPU R580. Tuttavia, venne utilizzata in complessi calcoli di numeri in virgola mobile usati in campo scientifico e finanziario invece che come acceleratore grafico 3D. AMD sostiene che questo processore è 8 volte più performante nei calcoli virgola mobile rispetto a una tradizionale elaborazione grafica.
In effetti, ATI ha profuso particolare attenzione nella ricerca e sviluppo (R&S) di prodotti GPGPU prima di essere acquisita da AMD, e annunciò l'adozione del progetto stream processing/GPGPU in linea con le GPU del 2006, nominate Radeon R580.
Il marchio fu dapprima rinominato come AMD FireStream con la seconda generazione di processori Stream (basati sul processo a 55 nm), messi in commercio in data 8 novembre 2007. Piani futuri includono lo sviluppo in un modulo MXM, progettato per applicazioni embedded e future generazioni di prodotti nella seconda metà del 2008.

## Hardware

La serie Radeon sono processori vettoriali a 32 bit in singola precisione. Grazie all'elevato parallelismo dei processori vettoriali, questi hanno avuto un elevato impatto in applicazioni di data processing. Il progetto di massa Folding@Home ha riportato incrementi prestazionali da 20 a 40 volte superiori usando una scheda grafica basata su chipset R580.
La Radeon R580 include un totale di 48 pixel e vertex shaders, che diventano processori paralleli nei calcoli in virgola mobile. La ATI FireStream utilizza un'interfaccia PCI Express x16 per ottenere una banda di 8 GiB/s. La scheda è equipaggiata con 1 GB di memoria GDDR3 mentre la scheda viaggia ad una frequenza di 600 MHz di core e 1.3 GHz di memoria. La scheda ha l'abilità di eseguire 512 threads simultaneamente (multitreading simultaneo, SMT), con un TDP di 165 Watt. La differenza principale tra il FireStream e una scheda grafica Radeon ordinaria è che il processore stream difetta di connettori video.
L'hardware Stream Processing utilizza un'interfaccia chiamata THIN (Thin Hardware Interface), oppure Close to Metal (CTM, chiamato precedentemente Data Parallel Virtual Machine), per ampliare l'architettura GPU in addizione al set di istruzioni native utilizzate dai programmatori. Queste permettono di ottenere il diretto controllo dei processori Stream/ALU e dei Controller di memoria, e permettono di bypassare le API 3D.
La linea di sviluppo AMD prevede un aggiornamento alle ultime architetture GPU (Radeon R600) con la commercializzazione dell'ultima generazione di schede video FireGL (7 agosto 2007), che sono dotate di processori stream. L'architettura è stata concepita con uno processo produttivo a 80 nm, come la R580, con maggiore numero di processori paralleli e unità stream processing. In aggiunta, la memoria GDDR4 è stata incrementata a 2 GB, con un massimo di 128 GiB/s di banda. I prodotti FireGL basati sul core R600 XTX (FireGL V8600 e FireGL V8650) consumano molto di più rispetto a una ATI Firestream di prima generazione, con un TPD stimato rispettivamente sotto i 225 W e oltre i 255 W.
La seconda generazione, la AMD FIreStream 9170, è basata su chipset RV670 e realizzata con processo produttivo a 55 nm. Le sue caratteristiche principali sono di essere la prima GPU a supportare calcoli con numeri a doppia precisione, DMA asincrono (che permette ai processori e alla memoria di scambiare dati senza l'intervento della CPU), funzionalità di memory export, e consumi ridotti (meno di 150 W con 2 GB GDDR3 in un'interfaccia PCI-E 2.0, con 16 GiB/s di banda).
L'ultima generazione della linea AMD FireStream sono la FireStream 9250 e la FireStream 9270. La AMD FireStream 9250, annunciata il 16 giugno 2008, è basata su chipset RV770 ed è realizzata con processo produttivo a 55 nm. Le caratteristiche tecniche riportano 1 TFLOPS di potenza con operazioni numeriche a singola precisione, 1 GB di GDDR3 e un dissipatore a slot singolo. Mentre la sua variante, la AMD FireStream 9270, annunciata il 13 novembre 2008, basata su chipset RV770 con un altissimo numero di operazioni a virgola mobile con picco di 1.2 TFLOPS, monta 2 GB di GDDR5 e un dissipatore a doppio slot.

### Linea di sviluppo AMD

Le specifiche hardware degli stream processor distribuiti da AMD (e precedentemente da ATI) sono riassunte di seguito:
| Generazione | Modello | Scheda video equivalente | Core GPU | Thread max | Core | Core | Memoria | Memoria | Memoria | Memoria | Memoria | (Operazioni in virgola mobile al secondo) | (Operazioni in virgola mobile al secondo) | TDP (Watts) | Altro |
| Generazione | Modello | Scheda video equivalente | Core GPU | Thread max | Shaders (SPUs) $^{NB1}$ | Clock (MHz) | Banda (GiB/s) | Tipo | Larghezza bus (bit) | Ammontare (MiB) | Clock (MHz) | FP32 GFLOPs | FP64 GFLOPs | TDP (Watts) | Altro |
| 1st $^{NB2}$ | 580/2U | Radeon X1900 XTX | R580 | 512 | 48 | 600 | 83.2 | GDDR3 | 256 | 1024 | 650 | 375 | N/A | ≤165 | N/A |
| N/A $^{NB2}$ | N/A $^{NB2}$ | FireGL V8650 | R600 | ? | 64 (320) | 743 | 128.0 | GDDR4 | 512 | 1024 | 1000 | 475 | N/A | ≤225 | prima scheda FireGL con supporto stream processing |
| N/A $^{NB2}$ | N/A $^{NB2}$ | FireGL V8600 | R600 | ? | 64 (320) | 743 | 128.0 | GDDR4 | 512 | 2048 | 1000 | 475 | N/A | ≤255 | prima scheda FireGL con supporto stream processing |
| 2nd $^{NB2}$ | 9170 | Radeon HD 3870 | RV670 | ? | 64 (320) | 800 | 51.2 | GDDR3 | 256 | 2048 | 800 | 512 | 102.4 $^{NB3}$ | ≤105 | supporto FP doppia precisione |
| 3rd $^{NB2}$ | 9250 | Radeon HD 4850 | RV770 | 16,384 | 160 (800) | 625 | 63.5 | GDDR3 | 256 | 1024 | 993 | 1000 | 200 $^{NB3}$ | ≤150 | distribuito il 16 giugno, 2008 |
| 3rd $^{NB2}$ | 9270 | Radeon HD 4870 | RV770 | 16,384 | 160 (800) | 750 | 108.8 | GDDR5 | 256 | 2048 | 850 | 1200 | 240 | <160 | distribuito il 13 novembre, 2008 |
Note:
    NB1: Il numero di Unità Stream Processing può essere applicato solo a un hardware compatibile con DirectX 10, che contiene shader unificati (implementati in prodotti basati su Radeon R600 e architetture maggiori, dove vi sono 5 ALU in ogni shader, quattro MADD/ADD/MUL/ADD intero/dot product e uno per transcendental functions), creando 320 Unità Stream Processing in 64 shader, appunto, unificati. Inoltre notare che l'architettura è implementato in maniera differente rispetto alla controparte Nvidia, nei prodotti Tesla. La SP nelle implementazioni Nvidia ha un'alta frequenza di clock (2,35x o maggiore) rispetto alle altre parti del core, mentre le SPU Ati hanno la stessa frequenza del core.
    NB2: La prima generazione di prodotti originariamente utilizzava il brand ATI FireStream, ma successivamente fu rinominato AMD Stream Processor dopo l'acquisizione della ATI da parte di AMD e la ricostruzione del brand. La scheda AMD FireStream 9170 basata su chipset RV670 è stata messa in commercio senza avere delle schede precedenti basate su R600 poiché le schede messe in commercio precedentemente sotto la vecchia linea di sviluppo ATI (inoltre prototipi di schede con configurazioni simili alle FireGL V8650 furono pubblicamente mostrate senza però output a video). A partire dalla serie 2007 delle FireGL, le schede high-end e ultra high-end hanno ottenuto il supporto allo stream processing.
    NB3: Il tempo di esecuzione per operazioni in precisione singola è teoricamente un quinto rispetto a quello rappresentato.

## Software

Una delle prime ditte a supportare FireStream è stata PeakStream (acquisita da Google nel 2007, in giugno), che è stata la prima a realizzare un'aperta versione beta del software supportando CTM e FireStream oltre a x86 e Cell (Cell Broadband Engine). FireStream è stata acclamata per essere 20 volte più veloce utilizzando una comune applicazione rispetto a una regolare CPU dopo aver eseguito il software PeakStream. RapidMind inoltre ha provveduto a realizzare un software stream processing funzionante con ATI e NVIDIA, oltre che per il processore Cell.

### Software Development Kit

La prima release dell'SDK (v1.0) fu pubblicata nel dicembre 2007, sotto licenza AMD EULA, per essere eseguita sotto Windows XP. Il software includeva "Brook+", una versione riveduta e corretta del linguaggio Brook prodotto dalla Stanford University, come variante di ANSI C (linguaggio C), open source e ottimizzato per stream computing. Furono incluse anche la AMD Core Math Library (ACML) e la Framewave (APL) con delle ottimizzazione per la AMD FireStream, e la libreria CODA (rinominata poi "Accelerated Video Transcoding" o AVT) per accelerazioni di codifica video. Un'altra parte importante dell'SDK, il Compute Abstraction Layer (CAL), è un layer di sviluppo software focalizzato per accessi a basso livello, attraverso l'interfaccia hardware CTM, all'architettura GPU scritto in vari linguaggi di programmazione ad alto livello.
Durante il mese di marzo 2010, AMD distribuisce la versione 2.01 dell'ATI Stream Software Development Kit, che include il supporto alle OpenCL 1.0, un linguaggio di programmazione sviluppato da Khronos Group. Il supporto alle nuove vie di utilizzo shader della futura generazione di API Microsoft chiamato DirectX 11 verrà implementato nelle release future dell'SDK Stream.

### AMD APP SDK

AMD Stream SDK (ATI Stream SDK) è stato sostituito da AMD APP SDK, disponibile per Microsoft Windows e Linux, a 32-bit e 64-bit. APP sta per "elaborazione parallela accelerata", e si rivolge anche Heterogeneous System Architecture (non solo GPU).

## Vantaggi

Il sistema di prova AMD con 2 Dual Core Opteron e 2 GPU Radeon R600 e sistema operativo Microsoft Windows XP Professional raggiunge 1 TeraFLOPS, nei calcoli multiply-add (MADD). A confronto, un Intel Core 2 Quad Q9650 3.0 GHz raggiunge 48 GFLOPS. Tuttavia, dobbiamo chiaramente distinguere tra operazioni aritmetiche in singola e doppia precisione: l'esempio precedente utilizza operazioni in virgola mobile a precisione singola, l'ultimo rappresenta operazioni a precisione doppia.
Le dimostrazioni recenti mostrano che con test di scansione con Kaspersky SafeStream antivirus ottimizzato per i processori stream, il sistema con 2 Opteron a 6.2 Gbit/s (775 MiB/s) di banda, è 21 volte più veloce se confrontato con altri sistemi dual-processor. I sistemi stream processor inoltre mostrano solamente 1-2% di utilizzo della CPU la quale indica significativi passaggi di lavoro dalla CPU allo stream processor.

## Limitazioni

* Confrontato, per esempio, a tradizionali acceleratori come il processore matematico a 64 bit floating point (FP64) CSX600 da ClearSpeed che sono usati nei supercomputer attuali, le recenti e vecchie GPU di ATI (e NVIDIA) sono processori a 32 bit con supporto unicamente a operazioni in precisione singola.
** Invece della doppia precisione a 64 bit dei supercomputer, la seconda e terza generazione di stream processor (ad esempio AMD FireStream 9170, 9250 e 9270) sono capaci di trattare operazioni in virgola mobile a doppia precisione. Questo è il risultato di un supporto contenuto come parte dei requisiti delle API DirectX 10.1. Tuttavia, le operazioni in precisione doppia (usate frequentemente nei benchmark dei supercomputer) possono ottenere solo parte delle performance teoriche rispetto alle operazioni in singola precisione, gli attuali risultati possono essere minori, poiché la GPU non ha il pieno supporto alle operazioni in doppia precisione. Per esempio l'attuale top di gamma AMD FireStream 9270 ha una capacità di calcolo pari a 1.2 TeraFLOPS nelle operazioni in singola precisione, ma solamente 240 GigaFLOPS per la doppia precisione.
* La ricorsione non è supportata in Brook+ perché tutte le chiamate alle funzioni sono sostituite in fase di compilazione. Usando CAL, le funzioni (ricorsive o no) sono supportate a 32 livelli.
* Solo il filtro texture bilineare è supportato; texture mipmap e il filtro anisotropico non sono supportate in questo momento.
* Varie deviazioni dallo standard IEEE 754. I numeri denormalizzati e NaN non sono supportati; l'arrotondamento non può essere cambiato, e la precisione delle divisioni/radici è molto minore rispetto ai calcoli in precisione singola.
* Le funzioni non possono avere un numero variabile di argomenti. Lo stesso problema esiste per le funzioni ricorsive.
* Convertire da un numero decimale a un intero con la GPU non è molto differente dal farlo in una CPU x86; questo non è pienamente conforme allo standard IEEE 754.
* Utilizzare la "sincronizzazione globale" non è molto efficiente, dato che forza la GPU a far ripartire il kernel e fare seguire la sincronizzazione alla CPU.
* La larghezza di banda e la latenza tra CPU e GPU può essere un collo di bottiglia, ma questo sarà alleviato in futuro introducendo interconnessioni con maggiore banda.