Надані відповіді поки дуже приємні, але я також очікував наголоси на певній різниці між паралельною та розподіленою обробкою: код виконаний. Розглядаючи паралельні процеси, виконаний код однаковий, незалежно від рівня паралелізму (інструкція, дані, завдання). Ви пишете один код , і він буде виконуватися різними потоками / процесорами, наприклад, під час обчислення матричних продуктів або генерації перестановок.
З іншого боку, розподілене обчислення передбачає виконання різних алгоритмів / програм одночасно в різних процесорах (з однієї або декількох машин). Пізніше такі обчислення об'єднуються у проміжні / кінцеві результати, використовуючи доступні засоби зв'язку / синхронізації даних (спільна пам'ять, мережа). Крім того, розподілені обчислення дуже привабливі для обробки BigData, оскільки дозволяють використовувати паралелізм диска (як правило, вузьке місце для великих баз даних).
Нарешті, для рівня паралелізму це може сприйматись як обмеження синхронізації. Наприклад, у GPGPU, який є одноінструкційним даними з декількома даними (SIMD), паралелізм відбувається за рахунок різних входів для однієї інструкції, кожна пара (data_i, інструкція) виконується іншим потоком. Така стриманість полягає в тому, що у випадку розбіжних гілок потрібно відкинути безліч непотрібних обчислень, доки нитки не зближаться. Однак для потоків процесора вони зазвичай розходяться; але можна використовувати структури синхронізації для забезпечення одночасного виконання конкретних розділів коду.