Se avete acquistato da poco un computer, avete anche la certezza di avere due o quattro unità di elaborazione (dual-core o quad-core), indipendentemente dal numero di processori e di core per ciascun processore presente sulla macchina.
In un futuro ormai prossimo, con il previsto avvento di processori multicore dotati di decine e decine di core (si parla già ora di processori in fase di produzione con 32 core e perfino con oltre 50 core), avremo una capacità di elaborazione estremamente potenziata rispetto ad oggi.
Dal punto di vista dell’utente vengono comunque considerati dei processori indipendenti e, quindi, utilizzerò il termine "processori" anche quando si tratta di core multipli all’interno di un unico processore.
Il problema, però, consiste nell’impossibilità di utilizzare a fondo le risorse a nostra disposizione e quindi di dividere il carico di lavoro tra tutti i processori disponibili, con il risultato di appesantire un unico processore e utilizzare più tempo per terminare un’attività.
Questo modo di lavorare è certamente comodo per il programmatore, perché scrivere un programma per un singolo processore è più semplice che dover governare anche la complessità della elaborazione concorrente. Del resto è il modo di lavorare che abbiamo sempre avuto fin dalla nascita dei personal computer.
Ora, però, abbiamo un hardware che ha un potenziale di elaborazione estremamente elevato e tutta questa potenza ha bisogno di strumenti di sviluppo adeguati per essere espressa realmente, altrimenti si vanificherebbero gli sforzi dei produttori di processori nel proporre prodotti all’avanguardia.
La parola d’ordine deve essere quindi parallel programming (sviluppo di programmi con attività svolte in parallelo), associata al termine parallel computing (esecuzione di uno o più programmi in parallelo su più processori).
Il concetto di programmazione parallela non è una novità, esiste già da tempo una formalizzazione del cosiddetto calcolo parallelo: nel 1967 fu pubblicata la "Legge di Amdahl" che indicava le basi ingegneristiche sia per l’elaborazione in cluster (elaborazione distribuita su più computer collegati fra loro, Figura 1),
sia per quella multiprocessore (elaborazione distribuita su più processori dello stesso computer, Figura 2).
Lo scenario che finora ci ha dato sicurezza, ma che ci ha anche limitati, è destinato a cambiare drasticamente. Infatti, il .NET Framework 4.0 ci ha portato una grande novità: la possibilità di creare programmi in grado di sfruttare tutti i processori disponibili.
Adesso la programmazione parallela è possibile anche con un comune personal computer, semplicemente utilizzando le librerie fornite con il .NET Framework 4.0 e quindi con Visual Studio 2010 e con i linguaggi Visual Basic e C#.
Questa nuova possibilità porta con sé molti vantaggi, tra i quali una maggiore scalabilità dei nostri programmi e migliori prestazioni (maggiore sfruttamento dell’hardware e minori tempi di esecuzione).
Occorre però precisare che la programmazione parallela ci offre il meglio di sé quando le elaborazioni possono essere suddivise su più processori e quando si tratta di elaborazioni sufficientemente "pesanti". Potrebbe, quindi, verificarsi il caso di un peggioramento delle prestazioni o, nel migliore dei casi, di prestazioni assolutamente equivalenti alla programmazione tradizionale (monoprocessore), quando l’applicazione richiede poche risorse o quando le istruzioni da eseguire solo talmente brevi da non far risultare conveniente questo approccio.