Les réponses présentées jusqu'à présent sont très agréables, mais je m'attendais également à ce que l'accent soit mis sur une différence particulière entre le traitement parallèle et distribué: le code exécuté. Compte tenu des processus parallèles, le code exécuté est le même, quel que soit le niveau de parallélisme (instruction, données, tâche). Vous écrivez un seul code , et il sera exécuté par différents threads / processeurs, par exemple, lors du calcul des produits matriciels ou de la génération de permutations.
D'autre part, l'informatique distribuée implique l'exécution simultanée de différents algorithmes / programmes dans différents processeurs (à partir d'une ou plusieurs machines). Ces calculs sont ensuite fusionnés en un résultat intermédiaire / final en utilisant les moyens disponibles de communication / synchronisation des données (mémoire partagée, réseau). De plus, l'informatique distribuée est très intéressante pour le traitement BigData, car elle permet d'exploiter le parallélisme de disque (généralement le goulot d'étranglement pour les grandes bases de données).
Enfin, pour le niveau de parallélisme, il peut être plutôt pris comme une contrainte sur la synchronisation. Par exemple, dans GPGPU, qui est une donnée multiple à instruction unique (SIMD), le parallélisme se produit en ayant différentes entrées pour une seule instruction, chaque paire (data_i, instruction) étant exécutée par un thread différent. Telle est la retenue que, en cas de branches divergentes, il est nécessaire de rejeter beaucoup de calculs inutiles, jusqu'à ce que les threads reconvergent. Pour les threads CPU, cependant, ils divergent généralement; cependant, on peut utiliser des structures de synchronisation pour accorder l'exécution simultanée de sections spécifiques du code.