Proseguiamo il tutorial sugli strumenti offerti da Intel per la programmazione parallela in C++ introducendo
Intel Array Building Blocks (ArBB). Si tratta di una libreria, che implementa un particolare sistema, il quale consente di ottenere soluzioni scalabili sulle piattaforme Intel già disponibili sul mercato, ma anche su quelle che verranno proposte in futuro.
Prima di specificare le caratteristiche di questa tecnologia e presentare qualche esempio, è utile chiarire la differenza fra
data-parallelism e
vectorization: nel primo caso si parla di parallelismo dei dati, ossia dell'applicazione dello
stesso codice a più frammenti di dati, senza dover specificare un particolare ordine di esecuzione delle operazioni rispetto ai dati stessi. Il secondo caso riguarda invece l'applicazione contemporanea di uno stesso operatore o funzione a più dati, utilizzando
operandi costituiti da vettori invece che da scalari. Quest'ultima operazione è resa possibile dalla disponibilità di apposite istruzioni della CPU, che consentono l'elaborazione su un numero di operandi maggiore di uno.
Uno degli ostacoli alla diffusione dell'utilizzo delle operazioni vettoriali è dato dalle differenti operazioni supportate dalle CPU sul mercato, per cui spesso si è adottata una politica conservativa, rilasciando codice ottimizzato solo per alcune famiglie di processori – oppure non ottimizzate – per una più semplice politica di deploy.
Intel ArBB è un'API supportata da una libreria, che estende il linguaggio di programmazione C++ senza l'utilizzo di un pre-processore. La piattaforma è
portabile e consente di implementare delle soluzioni di calcolo parallelo indipendenti dall'hardware, come vedremo a breve. La
semantica utilizzata nella scrittura delle applicazioni, inoltre, rimane sequenziale, consentendo una maggiore leggibilità del codice prodotto e mantenendo la stessa semplicità dello sviluppo sequenziale classico, offrendo però un'ottima
data-locality e una sicurezza
by default, che esenta lo sviluppatore dal doversi preoccupare di problematiche legate all'accesso concorrente ai dati come
deadlock e
race condition.
Un programma sviluppato con
Intel ArBB è, in pratica, compilato due volte: una prima volta dal nostro compilatore, che genera il codice binario dal nostro sorgente C++. La
seconda compilazione avviene invece in fase di esecuzione del software nella macchina sulla quale è avvenuto il deploy dell'applicazione: viene generato dinamicamente il codice per l'esecuzione ad alta performance specifico per l'architettura della macchina, grazie ad
Intel ArBB Dynamic Engine.