Modello Roofline
# Modello Roofline

Il modello Roofline (in italiano letteralmente "linea del tetto") è un modello di performance visuale che consente in maniera intuitiva di stimare le performance di un dato kernel computazionale o di una applicazione che esegue su architetture di calcolo di tipo multi-core, many-core o su acceleratori, mostrando graficamente le limitazioni inerenti all'hardware usato e le potenziali ottimizzazioni da poter applicare, nonché la priorità con cui esse necessitano di essere applicate. Facendo convergere aspetti riguardanti la località dei dati, la banda, e paradigmi di parallelizzazione in un'unica raffigurazione, il modello di fatto costituisce una valida alternativa al semplice utilizzo della percentuale del picco di performance per valutare la qualità delle prestazioni ottenute, dal momento che è in grado di modellare analiticamente sia dettagli implementativi che limitazioni alle prestazioni dovute a caratteristiche intrinseche dell'architettura considerata.

Il modello Roofline nella sua versione base può essere visualizzato graficando le prestazioni relative all'esecuzione di istruzioni a virgola mobile (FLOPS) come funzione del picco di performance, il picco di banda della macchina, e l'intensità operativa. La curva risultante, chiamata appunto Roofline, costituisce un limite superiore alle prestazioni ottenibili, al di sotto della quale esistono le effettive performance per il dato kernel o applicazione. Suddetta curva include due limiti massimi specifici della piattaforma: un limite derivato dalla banda di memoria e un limite derivato dal picco di performance dell'unità di computazione.

## Termini e metriche di performance associate

### Lavoro

Il lavoro $W$ indica il numero di operazioni eseguite da un dato kernel computazionale o applicazione. Questa metrica può riferirsi ad un qualsiasi tipo di operazione, a partire dal numero di punti di array aggiornati al secondo, al numero di operazioni intere al secondo, al numero di operazioni a virgola mobile per secondo (FLOPS), e la scelta di una o l'altra è dettata dal caso e dalle necessità. Tuttavia, nella maggior parte dei casi, $W$ è espresso in FLOPS.

Da notare che il lavoro $W$ è una proprietà del dato kernel o applicazione e pertanto dipende solo parzialmente dalle caratteristiche della piattaforma.

### Traffico di memoria

Il traffico di memoria $Q$ indica il numero di bytes di memoria trasferiti durante l'esecuzione del kernel o applicazione. Contrariamente a $W$, $Q$ è altamente dipendente dalle proprietà della piattaforma usata, come per esempio la topologia della cache.

### Intensità operativa

L'intensità operativa $I$, alle volte definita come intensità aritmetica, rappresenta il rapporto tra il lavoro $W$ e il traffico di memoria $Q$:

    $I={W \over Q}$

e indica il numero di operazioni effettuate per byte di traffico di memoria. Quando il lavoro $W$ è espresso in FLOPS, la risultante intensità operativa $I$ è espressa come il rapporto tra le operazioni a virgola mobile e il volume di dati trasferiti (FLOPS/byte).

## Roofline naïve

Il Roofline naïve è ottenuto tramite una semplice analisi "di limite e collo di bottiglia" (bound and bottleneck). In questa formulazione del modello Roofline sono presenti solo due parametri: picco di performance e picco di banda della specifica architettura; ed una variabile: intensità operativa. Il picco di performance, espresso in generale in GFLOPS, può essere generalmente derivato da manuali architetturali, mentre il picco di banda, che nello specifico si riferisce all picco di banda della DRAM, è invece ottenuto tramite benchmarking. Il grafico risultante, in generale avente entrambi gli assi in scala logaritmica, è quindi derivato dalla formula seguente:

    $P=\min {\begin{cases}\pi \\\beta \times I\end{cases}}$

Dove $P$ rappresenta le performance ottenibili, $\pi$ rappresenta il picco di performance, $\beta$ rappresenta il picco di banda e $I$ rappresenta l'intensità operativa. Il punto in cui le performance saturano al livello di picco di performance $\pi$ - i.e. dove il limite diagonale e quello orizzontale si incontrano - è definito come punto di cresta (ridge point). Il punto di cresta consente di effettuare utili considerazioni sulle prestazioni complessive della macchina, poiché fornisce la minima intensità operativa richiesta per poter raggiungere il picco di performance, e pertanto suggerisce la quantità di sforzo richiesto al programmatore per approcciare, almeno teoricamente, suddetto picco.

Un dato kernel o applicazione è quindi caratterizzato da un punto dato dalla sua intensità operativa $I$ (sulle ascisse). Il termine relativo alle performance ottenibili $P$ è pertanto identificato tracciando una linea verticale passante per quel punto che incroci la Roofline. Conseguentemente, il kernel o applicazione è detto essere memory-bound se $I\leq \pi /\beta$. Se invece $I\geq \pi /\beta$, la computazione è detta essere compute-bound.

## Aggiungere limiti superiori al modello

Il Roofline naïve fornisce solo un limite superiore massimo (il massimo teorico) alle performance. Sebbene questa versione del modello di per sé consente di ricavare utili informazioni sulle performance ottenibili, è di fatto incompleto, in quanto non modella in maniera sufficientemente dettagliata le caratteristiche della piattaforma utilizzata e pertanto non consente una analisi esaustiva dei fattori che limitano le prestazioni. Se ad esempio il kernel computazionale o applicazione in oggetto raggiunge prestazioni che sono molto al di sotto della Roofline, potrebbe essere utile catturare altri limiti superiori delle performance, in aggiunta ai semplici picco di banda e picco di performance, al fine di guidare lo sviluppatore nel processo di scelta delle ottimizzazioni da implementare, o ancora per valutare qualitativamente l'adeguatezza dell'architettura usata rispetto al kernel o applicazione di cui si sta effettuando l'analisi. I limiti superiori aggiunti impongono pertanto un limite sulle performance ottenibili che è al di sotto della Roofline, e indicano che il kernel o applicazione non può passare oltre nessuno di questi limiti senza prima eseguire l'ottimizzazione associata.

Il grafico Roofline può essere espanso in tre aspetti differenti: comunicazione, aggiungendo i limiti di banda, computazione, aggiungendo i limiti in-core, e località dei dati, aggiungendo i muri di località.

* Un esempio di modello Roofline con l'aggiunta di limiti di banda. In questo modello, i due limiti addizionali rappresentano la mancanza di software prefetching e di una organizzazione NUMA della memoria.
* Un esempio di modello Roofline con l'aggiunta di limiti in-core, dove i due limiti aggiunti rappresentano la mancanza di instruction level parallelism e task level parallelism.
* Un esempio di modello Roofline con aggiunti i muri di località. Il muro etichettato come 3 C's indica la presenza di tutti e tre i tipi di cache miss: compulsory, capacity e conflict miss. Il muro etichettato con 2 C's indica la presenza di compulsory e capacity miss o compulsory e conflict miss. L'ultimo muro denota la presenza dei soli compulsory miss.

### Limiti di banda

I limiti di banda sono linee diagonali che limitano la banda e sono piazzate al di sotto della diagonale di picco di banda. La loro esistenza è causata dalla mancanza di specifiche ottimizzazioni architetturali relative alla memoria, come la coerenza delle cache, o di ottimizzazione software, come la mancanza di una sufficiente esposizione della concorrenza (che conseguentemente può limitare l'utilizzo di banda).

### Limiti in-core

I limiti in-core sono curve situate al di sotto della reale Roofline, la cui presenza scaturisce dalla mancanza di una determinata forma di parallelismo. Questi limiti superiori impongono di fatto una riduzione su quanto elevate le performance di una data applicazione o kernel computazionale possono essere. Le performance non possono eccedere questi limiti in-core a meno che la relativa forma di parallelismo sia esistente ed effettivamente sfruttata. Suddetti limiti possono in certi casi essere direttamente derivati dai manuali architetturali e non soltanto da benchmarking.

### Muri di località

Se l'assunzione idealistica che l'intensità operativa è funzione delle sole caratteristiche del dato kernel o applicazione è rimossa, e pertanto viene considerata la topologia della cache, e di conseguenza la presenza di cache miss, l'intensità operativa risulta di conseguenza dipendente da una combinazione del kernel e dell'architettura in uso. Ciò può risultare in un degrado delle prestazioni dipendente dal bilanciamento tra l'intensità operativa risultante e il punto di cresta. Contrariamente alle due categorie di limiti precedenti, le linee risultanti da questo tipo di analisi sono linee verticali che limitano l'intensità operativa e che non possono essere superate senza la dovuta ottimizzazione. Per questa ragione, suddette linee sono chiamate muri di località o più semplicemente muri di intensità operativa.

## Estensioni del modello

Successivamente alla sua introduzione, il modello è stato ulteriormente esteso per considerare un più ampio insieme di metriche e colli di bottiglia relativi all'hardware. Attualmente in letteratura si possono trovare estensioni che considerano l'impatto di una organizzazione della memoria NUMA, di esecuzione delle istruzioni fuori ordine, della latenza delle memorie, e che modellano la gerarchia della cache a un livello più dettagliato, al fine di fornire una visione più completa dei fattori che limitano le prestazioni e conseguentemente guidare il processo di ottimizzazione.

Inoltre, il modello è stato esteso anche per adattarsi ad architetture specifiche e alle relative caratteristiche, come nel caso delle FPGA.

