В чем разница между параллелизмом и параллелизмом? - PullRequest
897 голосов
/ 26 июня 2009

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

Примеры приветствуются.

Ответы [ 32 ]

3 голосов
/ 08 апреля 2018

«Параллельность» - это когда несколько вещей в процессе .

«Параллелизм» - это когда параллельные вещи прогрессируют одновременно .


Примеры параллелизма без параллелизма:

  • Несколько потоков на одном ядре.
  • Несколько сообщений в очереди сообщений Win32.
  • Несколько SqlDataReader с на MARS соединении.
  • Несколько JavaScript обещаний во вкладке браузера.

Обратите внимание, однако, что разница между параллелизмом и параллелизмом часто является вопросом перспективы. Приведенные выше примеры не параллельны с точки зрения (наблюдаемых эффектов) выполнения вашего кода. Но существует параллелизм на уровне инструкций даже внутри одного ядра. Существуют аппаратные средства, выполняющие операции параллельно с процессором, а затем прерывающие работу процессора, когда это будет сделано. Графический процессор может отображать на экране, пока выполняется оконная процедура или выполняется обработчик события. СУБД может обходить B-деревья для следующего запроса, пока вы все еще извлекаете результаты предыдущего. Браузер может делать макет или работать в сети, пока выполняется Promise.resolve(). И т. Д., И т. Д.

Итак, поехали. Мир как всегда грязен;)

3 голосов
/ 15 апреля 2017

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

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

Скопировано из моего ответа: https://stackoverflow.com/a/3982782

3 голосов
/ 17 января 2017

Параллельность может включать в себя задачи, выполняемые одновременно или нет (они действительно могут выполняться в отдельных процессорах / ядрах, но они также могут выполняться в «тиках»). * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *} * * * * * * * *1004* * * * * * * * * * * * * * * * * * * * * * * * * * * * *1004*. Так что в основном это часть некоторых вычислений. Вы должны быть умны в том, что вы можете делать одновременно, а что нет, и как синхронизировать.

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

2 голосов
/ 09 августа 2018

(Я очень удивлен, что такой фундаментальный вопрос не решается правильно и аккуратно в течение многих лет ...)

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

Что касается разницы, вот объяснение от Роберта Харпера :

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

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

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

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

2 голосов
/ 17 апреля 2018

Самый простой и самый элегантный способ понять эти два, на мой взгляд, таков. Параллелизм позволяет чередовать выполнение и поэтому может создать иллюзию параллелизма. Это означает, что параллельная система может, например, запускать ваше видео на Youtube вместе с написанием документа в Word. Базовая ОС, будучи параллельной системой, позволяет этим задачам чередовать их выполнение. Поскольку компьютеры выполняют инструкции так быстро, это создает видимость одновременного выполнения двух действий.

Параллелизм - это когда такие вещи действительно параллельны . В приведенном выше примере вы можете обнаружить, что код обработки видео выполняется на одном ядре, а приложение Word - на другом. Обратите внимание, что это означает, что параллельная программа также может быть параллельной! Структурирование вашего приложения с помощью потоков и процессов позволяет вашей программе эксплуатировать базовое оборудование и потенциально может выполняться параллельно.

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

Надеюсь, это поможет!

2 голосов
/ 20 февраля 2017

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

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

1 голос
/ 17 февраля 2014

Отлично, позвольте мне взять сценарий, чтобы показать, что я понимаю. предположим, что есть 3 ребенка по имени: A, B, C. A и B говорят, C слушают Для A и B они параллельны: A: Я А. Б: Я Б.

Но для C его мозг должен принять параллельный процесс для прослушивания A и B, это может быть: Я, Я, А, Б.

1 голос
/ 15 декабря 2014

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

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

1 голос
/ 19 августа 2017

Объяснение из этого источника было полезно для меня:

Параллельность связана с тем, как приложение обрабатывает несколько задач. работает на. Приложение может обрабатывать одну задачу за раз (последовательно) или работать над несколькими задачами одновременно (Одновременно).

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

Как видите, приложение может быть параллельным, но не параллельным. Это означает, что он обрабатывает более одной задачи одновременно, но задачи не разбиты на подзадачи.

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

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

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

1 голос
/ 10 июля 2015

Понятие «параллелизма» Пайка - это намеренное решение при разработке и реализации. Дизайн программы с одновременной поддержкой может демонстрировать или не демонстрировать поведенческий «параллелизм»; это зависит от среды выполнения.

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

Язык программирования Pike's Go иллюстрирует это в высшей степени: все его функции - это потоки, которые могут одновременно работать правильно, т. Е. Вызов функции всегда создает поток, который будет работать параллельно с вызывающей стороной, если система способна на это. Приложение с сотнями или даже тысячами потоков является совершенно обычным явлением в его мире. (Я не эксперт в Go, это мое мнение.)

...