В чем разница между параллельным и параллельным программированием?

в чем разница между параллельным программированием и параллельным программированием? Я спросил google, но не нашел ничего, что помогло бы мне понять эту разницу. Не могли бы вы привести пример для обоих?

пока я нашел это объяснение:http://www.linux-mag.com/id/7411 - но "параллелизм-это свойство программы" vs "параллельное выполнение-это свойство машины" для меня недостаточно - все же я не могу сказать, что есть что.

14 ответов


Если вы программируете с помощью потоков (параллельное программирование), это не обязательно будет выполняться как таковое (параллельное выполнение), поскольку это зависит от того, может ли машина обрабатывать несколько потоков.

вот наглядный пример. Резьбы на безрезьбовой машине:

        --  --  --
     /              \
>---- --  --  --  -- ---->>

потоки на продетой нитку машине:

     ------
    /      \
>-------------->>

тире представляют собой выполненный код. Как вы можете видеть, они оба разделяются и выполняются отдельно, но резьбовая машина может выполнять несколько отдельных частей сразу.


параллельное программирование касается операций, которые, как представляется, перекрываются и в первую очередь связаны со сложностью, возникающей из-за недетерминированного потока управления. Количественные затраты, связанные с параллельными программами, обычно являются как пропускной способностью, так и задержкой. Параллельные программы часто связаны с IO, но не всегда, например, параллельные сборщики мусора полностью находятся на CPU. Педагогическим примером параллельной программы является веб-искатель. Эта программа инициирует запросы на веб-страницы и принимает ответы одновременно по мере того, как результаты загрузки становятся доступными, накапливая набор страниц, которые уже были посещены. Поток управления недетерминирован, так как ответы не всегда поступают в одном и том же порядке при каждом запуске программы. Эта характеристика может затруднить отладку параллельных программ. Некоторые приложения принципиально параллельны, например, веб-серверы должны обрабатывать клиентские соединения одновременно. Erlang, пожалуй, самый перспективный будущий язык для высоко параллельного программирования.

параллельное программирование касается операций, которые перекрываются для конкретной цели улучшения пропускной способности. Трудности параллельного программирования устраняются путем детерминирования потока управления. Как правило, программы порождают наборы дочерних задач, которые выполняются параллельно, а родительская задача продолжается только после завершения каждой подзадачи. Это упрощает отладку параллельных программ. Трудная часть параллели программирование-это оптимизация производительности по таким вопросам, как детализация и связь. Последнее по-прежнему является проблемой в контексте многоядерных систем, поскольку передача данных из одного кэша в другой сопряжена со значительными затратами. Плотная Матрица-Матрица умножения является педагогическим примером параллельного программирования и может быть эффективно решена с помощью алгоритма разделения и завоевания Штраасена и атаковать подзадачи параллельно. Cilk, пожалуй, самый перспективный язык высокопроизводительного параллельного программирования на компьютерах с общей памятью (включая многоядерные).


https://joearms.github.io/published/2013-04-05-concurrent-and-parallel-programming.html

Concurrent = две очереди и одна кофемашина.

Parallel = две очереди и две кофемашины.


интерпретация исходного вопроса как параллельный / параллельный вычисление вместо Программирование.

на параллельное вычисление два вычисления оба заранее независимо друг от друга. Второе вычисление не должно ждать, пока первое не будет завершено для его продвижения. Однако он не указывает механизм, как это достигается. В одноядерной установке, приостанавливать и чередовать между потоками необходимы (также вызванный упреждающий многопоточность).

на параллельное вычисление два вычисления оба продвигаются одновременно - это буквально в одно и то же время. Это невозможно с одним процессором и требует многоядерной установки вместо этого.

suspending and taking turns и parallel computing

по: " параллельный vs параллельный в узле.js".


Я считаю, что параллельное программирование относится к многопоточному программированию, которое позволяет вашей программе запускать несколько потоков, воздерживаясь от деталей оборудования.

параллельное программирование относится к конкретному проектированию алгоритмов программы, чтобы воспользоваться преимуществами доступного параллельного выполнения. Например, вы можете параллельно выполнить две ветви некоторых алгоритмов в ожидании, что он достигнет результата раньше (в среднем), чем если бы вы сначала проверили первый потом вторая ветка.


в представлении от процессора, он может быть описан этим рис

In the view  from a processor, It can be described by this pic

в представлении от процессора, он может быть описан этим рис


Я нашел этот контент в каком-то блоге. Думал, это полезно и актуально.

параллелизм и параллелизм-это не одно и то же. Две задачи T1 и T2 совпадают, если порядок, в котором эти две задачи выполняются в срок не предопределена,

T1 может быть выполнен и завершен до T2, T2 может быть выполнен и завершен до T1, T1 и T2 могут выполняться одновременно в одном экземпляре времени (параллелизм), T1 и T2 могут быть выполнены альтернативно, ... Если две параллельные потоки запланированы ОС для запуска на одном одноядерном не-SMT не-CMP-процессоре, вы можете получить параллелизм, но не параллелизм. Параллелизм возможен в многоядерных, многопроцессорных или распределенных системах.

параллелизм часто называют свойством программы и является понятием более общим, чем параллелизм.

источник: https://blogs.oracle.com/yuanlin/entry/concurrency_vs_parallelism_concurrent_programming


в программировании параллелизм-это состав независимо выполнение процессов, в то время как параллелизм-это одновременное выполнение (возможно, связанных) вычислений.
- Андрей Gerrand -

и

параллелизм-это состав независимого выполнения вычисления. Параллелизм-это способ структурирования программного обеспечения, в частности как способ, чтобы написать чистый код, который хорошо взаимодействует с реальным миром. Это не параллелизм.

параллелизм не является параллелизмом, хотя он включает параллелизм. Если у вас есть только один процессор, ваша программа все равно может быть параллельной, но она не может быть параллельной. С другой стороны, хорошо написанный параллельный программа может эффективно работать параллельно на мультипроцессоре. Что собственность может быть важна...
- Роб Пайк -

чтобы понять разницу, я настоятельно рекомендуем вам увидеть этого Роба Пайка (одного из создателей Golang) видео. 'Параллелизм-Это Не Параллелизм'


параллельное программирование происходит, когда код выполняется одновременно, и каждое выполнение не зависит от другого. Поэтому там, как правило, не preocupation об общих переменных и такие, потому что не likelly произошло.

однако параллельное программирование состоит из кода, выполняемого различными процессами / потоками, которые разделяют переменные и такие, поэтому при параллельном программировании мы должны установить какое-то правило, чтобы решить, какой процесс / поток выполняется во-первых, мы хотим этого для того, чтобы быть уверенными, что будет последовательность и что мы сможем с уверенностью знать, что произойдет. Если нет элемента управления, и все потоки вычисляют в одно и то же время и хранят вещи на одних и тех же переменных, как мы узнаем, чего ожидать в конце? Возможно, поток быстрее, чем другой, возможно, один из потоков даже остановился в середине его выполнения, а другой продолжил другое вычисление с поврежденной (еще не полностью вычисленной) переменной, возможности бесконечны. Именно в таких ситуациях мы обычно используем параллельное программирование вместо параллельного.


Это две фразы, которые описывают одно и то же с (очень немного) разных точек зрения. Параллельное программирование описывает ситуацию с точки зрения аппаратного обеспечения - по крайней мере, два процессора (возможно, в рамках одного физического пакета) работают над проблемой параллельно. Параллельное программирование-это описывать вещи с точки зрения программного обеспечения-два или более действий могут произойти в одно и то же время (одновременно).

проблема здесь что люди пытаются использовать эти две фразы, чтобы провести четкое различие, когда на самом деле ничего не существует. Реальность такова, что разделительная линия, которую они пытаются провести, была нечеткой и нечеткой на протяжении десятилетий, и со временем стала еще более нечеткой.

то, что они пытаются обсудить, - это тот факт, что когда-то у большинства компьютеров был только один процессор. Когда вы выполняли несколько процессов (или потоков) на этом одном процессоре, процессор действительно выполнял только одну инструкцию из одного из этих нитей за раз. Появление параллелизма было иллюзией-процессор переключался между выполнением инструкций из разных потоков достаточно быстро, чтобы человеческому восприятию (для которого все, что меньше 100 мс или около того, выглядит мгновенным) казалось, что он делает много вещей одновременно.

очевидный контраст с этим-компьютер с несколькими процессорами или процессор с несколькими ядрами, поэтому машина выполняет инструкции из нескольких потоков и / или процессов на точно в то же время; выполнение кода не может/не влияет на выполнение кода в другом.

теперь проблема: такое чистое различие имеет почти никогда не существовало. Компьютерные дизайнеры на самом деле довольно умны, поэтому они давно заметили, что (например), когда вам нужно было прочитать некоторые данные с устройства ввода-вывода, такого как диск, потребовалось долго времени (с точки зрения циклов процессора), чтобы закончить. Вместо того, чтобы оставлять CPU бездействующим, пока это случилось так, что они выяснили различные способы позволить одному процессу/потоку сделать запрос ввода-вывода и позволить коду из другого процесса/потока выполняться на процессоре, пока запрос ввода-вывода завершен.

Итак, задолго до того, как многоядерные процессоры стали нормой, у нас были операции из нескольких потоков, происходящих параллельно.

Это только верхушка айсберга, хотя. Десятилетия назад компьютеры начали обеспечивать еще один уровень параллелизма. Опять же, будучи довольно умными людьми, компьютерные дизайнеры заметили, что во многих случаях у них были инструкции, которые не влияли друг на друга, поэтому можно было выполнять более одной инструкции из одного потока одновременно. Одним из ранних примеров, который стал довольно хорошо известен, были контрольные данные 6600. Это был (с довольно большим отрывом) самый быстрый компьютер на земле, когда он был введен в 1964 году, и большую часть той же базовой архитектуры остается в использовании сегодня. Он отслеживал ресурсы, используемые каждой инструкцией, и имел набор исполнительных устройств, которые выполняли инструкции, как только ресурсы, от которых они зависели, стали доступными, очень похожи на дизайн самых последних процессоров Intel/AMD.

но (как говорили в рекламе) подождите-это еще не все. Есть еще один элемент дизайна, чтобы добавить еще больше путаницы. Было дано довольно много разных имен (например, "Hyperthreading", "SMT", "CMP"), но все они относятся к одной и той же основной идее: процессор, который может выполнять несколько потоков одновременно используется комбинация некоторых ресурсов, независимых для каждого потока, и ресурсов, совместно используемых потоками. В типичном случае это сочетается с описанным выше параллелизмом на уровне инструкций. Для этого у нас есть два (или более) набора архитектурных регистров. Затем у нас есть набор исполнительных единиц, которые могут выполнять инструкции, как только появятся необходимые ресурсы. Эти часто совмещают хорошо потому что инструкции от отдельно потоки практически не зависят от одних и тех же ресурсов.

потом, конечно, мы доберемся до современных систем с несколькими ядрами. Здесь все очевидно, верно? У нас есть N (где-то между 2 и 256 или около того, на данный момент) отдельных ядер, которые могут выполнять инструкции одновременно, поэтому у нас есть четкий случай реального параллелизма-выполнение инструкций в одном процессе/потоке не влияет на выполнение инструкций в другом.

Ну, вроде. Даже здесь у нас есть некоторые независимые ресурсы (регистры, единицы выполнения, по крайней мере один уровень кэша) и некоторые общие ресурсы (как правило, по крайней мере самый низкий уровень кэша, и, безусловно, контроллеры памяти и пропускная способность к памяти).

подводя итог: простые сценарии, которые люди любят противопоставлять общим ресурсам и независимым ресурсам, практически никогда не происходят в реальной жизни. Со всеми общими ресурсами мы получаем что-то вроде MS-DOS, где мы можем запускать только одну программу за раз, и мы нужно остановить одну, прежде чем мы вообще сможем запустить другую. С полностью независимыми ресурсами у нас есть N компьютеров под управлением MS-DOS (даже без сети для их подключения) без возможности делиться чем-либо между ними вообще (потому что, если мы даже можем поделиться файлом, ну, это общий ресурс, нарушение основной предпосылки ничего общего).

каждый интересный случай включает в себя некоторую комбинацию независимых ресурсов и общих ресурсов. Практически любой современный компьютер (и многое, что совсем не современно) имеет, по крайней мере, некоторую способность выполнять, по крайней мере, несколько независимых операций одновременно, и почти все более сложные, чем MS-DOS, воспользовались этим, по крайней мере, в какой-то степени.

хорошее, чистое разделение между "параллельным" и "параллельным", которое люди любят рисовать, просто не существует и почти никогда не существовало. То, что люди любят классифицировать как "параллельное", обычно включает по крайней мере один и часто больше различные типы параллельного выполнения. То, что они любят классифицировать как "параллельное", часто включает совместное использование ресурсов и (например) один процесс, блокирующий выполнение другого при использовании ресурса, который является общим между ними.

люди, пытающиеся провести четкое различие между" параллельными "и" параллельными", живут в фантазии о компьютерах, которые никогда не существовали.


Я понял разницу:

1) параллельный запуск в тандеме с использованием общих ресурсов 2) параллельный запуск бок о бок с использованием различных ресурсов

таким образом, вы можете иметь две вещи, происходящие одновременно независимо друг от друга, даже если они собираются вместе в точках (2) или две вещи, опираясь на одни и те же резервы на протяжении всех выполняемых операций (1).


1. Определения:

классическое планирование задач может быть SERIAL, PARALLEL или CONCURRENT

SERIAL: Анализ показывает, что задачи ДОЛЖНО БЫТЬ выполняется один за другим в известной последовательности обманул порядка!--22-->или он не будет работать.

то есть: Достаточно легко, мы можем жить с этим

PARALLEL: Анализ показывает, что задачи ДОЛЖНО БЫТЬ выполняются одновременно или он не будет работать.

  • любой сбой любой из задач-функционально или вовремя-приведет к полному сбою системы.
  • все задачи должны иметь общее надежное чувство времени.

то есть: Постарайся избежать этого, или мы будем пить чай со слезами. время.

CONCURRENT. анализ показывает, что мы НЕ НУЖНО ЗАБОТИТЬСЯ. Мы не беспечны, мы проанализировали это, и это не имеет значения; мы можете выполнить любой задача с помощью любой помещения в любой времени.

то есть: СЧАСТЛИВЫХ ДНЕЙ


часто планирования изменения при известных событиях, которые я назвал изменением состояния.


2. Это не { Программное Обеспечение / Программирование } Функция но Проектирование Систем подход:

люди часто думают, что это о программном обеспечении, но это на самом деле проектирование систем это предварительные даты компьютеры

программные системы были немного медленными в понимании, очень немногие языки программного обеспечения даже пытаются решить эту проблему.

вы можете смотреть до ТРАНСПЬЮТЕР язык occam если вы заинтересованы в хорошая попытка.

( occam имеет много главным образом новаторских (если не во-вторых к никаким ) характеристикам, ВКЛ. явная поддержка язык PAR и SER конструкторы выполнения частей кода, которые другие языки в основном страдают от наличия в forthcomming эпоху массивных массивов параллельных процессоров, доступных в последние годы, повторно изобретая колесо Inmos Транспьютеры, используемые более 35 лет назад (!!!))


3. Какой хороший Проектирование Систем заботится о том, чтобы покрыть:

лаконично, проектирование систем адреса следующее:

глагол - что ты делаешь. ( операция или алгоритм )

существительное-что ты делаешь это to. ( сведения или интерфейс )

когда-то начало, расписание, изменения состояния SERIAL, PARALLEL, CONCURRENT

где - как только вы знаете , когда вещи случаются тогда вы можете скажи здесь они могут произойти и не раньше.

почему - это способ сделать это? Есть ли другие способы? Есть ли лучший способ?

.. и последнее, но не менее .. ЧТО ПРОИСХОДИТ если ВЫ ЭТОГО НЕ ДЕЛАЕТЕ ?


4. Визуальные примеры параллельно и серийный подходы:

последние параллельно архитектура доступно в 2014 году в действии на массивах 16 -, 64 -, 1024-параллельных RISC uP-s

четверть века назад - в часть правда параллельная история С inmos Транспьютер CPU демо-видео с начала 1990-х годов

удачи


  • Concurrent programming В общем смысле относится к средам, в которых задачи, которые мы определяем, могут выполняться в любом порядке. Один задача может возникнуть до или после другой, и некоторые или все задачи могут быть исполняется одновременно.

  • Parallel programming специально относится к одновременному выполнению параллельных задач на разных процессорах. Таким образом, все параллельное программирование является параллельным, но не все параллельное программирование есть параллельный.

источник: Программирование PThreads-стандарт POSIX для лучшей многопроцессорной обработки, Buttlar, Farrell, Nichols


Хотя нет полного соглашение о разграничении терминов параллельно и одновременно, многие авторы делают следующие различия:

  • в параллельных вычислениях программа-это программа, в которой несколько задач могут выполняться в любой момент.
  • в параллельных вычислениях программа-это программа, в которой несколько задач тесно сотрудничают решить проблему.

таким образом, параллельные программы параллельны, но такая программа, как многозадачная операционная система, также является параллельной, даже если она запускается на машине с только одно ядро, так как в любой момент может выполняться несколько задач.

источник: введение в параллельное программирование, Питер Пачеко