Le risposte presentate finora sono molto belle, ma mi aspettavo anche un'enfasi su una particolare differenza tra elaborazione parallela e distribuita: il codice eseguito. Considerando i processi paralleli, il codice eseguito è lo stesso, indipendentemente dal livello di parallelismo (istruzioni, dati, attività). Scrivi un singolo codice e verrà eseguito da thread / processori diversi, ad es. Durante il calcolo di prodotti di matrici o la generazione di permutazioni.
D'altra parte, il calcolo distribuito comporta l'esecuzione simultanea di algoritmi / programmi diversi in processori diversi (da una o più macchine). Tali calcoli vengono successivamente uniti in risultati intermedi / finali utilizzando i mezzi disponibili di comunicazione / sincronizzazione dei dati (memoria condivisa, rete). Inoltre, il calcolo distribuito è molto interessante per l'elaborazione di BigData, poiché consente di sfruttare il parallelismo del disco (di solito il collo di bottiglia per database di grandi dimensioni).
Infine, per il livello di parallelismo, può essere preso piuttosto come un vincolo alla sincronizzazione. Ad esempio, in GPGPU, che è multi-istruzione (SIMD) a singola istruzione, il parallelismo si verifica avendo input diversi per una singola istruzione, ciascuna coppia (data_i, istruzione) viene eseguita da un thread diverso. Tale è la moderazione che, in caso di rami divergenti, è necessario scartare molti calcoli non necessari, fino a quando i fili non si ricongiungono. Per i thread della CPU, tuttavia, divergono comunemente; tuttavia, è possibile utilizzare strutture di sincronizzazione per garantire l'esecuzione simultanea di sezioni specifiche del codice.