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