Разница между «параллельным» и «параллельным» исполнением?


107

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

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

Кроме того, если мы рассмотрим что-то вроде асинхронного ввода-вывода, имеем ли мы дело с параллелизмом или параллелизмом?


27
В двух словах - одновременно: много разных операций происходит одновременно. Параллельно: одна и та же операция, разбитая на маленькие биты, происходит одновременно
Одед

3
@ Оде, я понимаю, что означают слова, но у меня возникают проблемы с пониманием последствий. У вас есть конкретный пример?
Blz

7
@Oded, я не совсем согласен с вами, нигде в их определениях (ни общих, ни применяемых к программированию) понятия «параллельный» и «параллельный» не упоминают о количестве или «размере» операций.
Шиван Дракон

2
@ Когда ты сказал "маленькие кусочки".
Авнер Шахар-Каштан

2
@Oded: Да, но это, кажется, корень недоразумения между вами и ShivanDragon.
Авнер Шахар-Каштан

Ответы:


97

Параллелизм и параллелизм - это две взаимосвязанные, но разные концепции.

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

Существуют различные способы достижения параллелизма. Одним из них является параллелизм - наличие нескольких процессоров, работающих над разными задачами одновременно. Но это не единственный способ. Другой способ заключается в переключении задач, которое работает следующим образом: задача A работает до определенной точки, затем процессор, работающий над ней, останавливается и переключается на задачу B, работает над ней некоторое время, а затем переключается обратно на задачу A. Если временные интервалы достаточно малы, пользователю может показаться, что обе вещи выполняются параллельно, даже если они на самом деле обрабатываются последовательно с помощью многозадачного процессора.


4
Случай B, как работает асинхронный ввод-вывод, нет?
Blz

6
@blz: Это верно. Это также, как превентивная многозадачность работает. Основное отличие состоит в том, что при асинхронном вводе-выводе программа решает отказаться от своего времени и сказать ЦПУ обрабатывать что-то еще, тогда как в многозадачном режиме с вытеснением, если работающий поток добровольно не отказывается от ЦП после достаточно долгого времени, ОС прерывает работу. Это.
Мейсон Уилер

1
Лучшее объяснение вручено
Конрад

@MasonWheeler: Если у нас только 1 процессор, то у нас может быть только параллелизм, без параллелизма. Правильно? Параллельность может быть достигнута более чем одним процессором. Правильно? И если это правильно и если у нас есть только 1 процессор, то потоки из Java 8 бесполезны.
Аниш Миттал

1
Прямо о первых нескольких пунктах. Что касается последнего, является ли параллелизм единственной выгодой, которую вы получаете от Streams? Я не Java-разработчик, но у меня сложилось впечатление, что потоки Java примерно эквивалентны LINQ, и это имеет реальные преимущества в выразительности и простоте разработки.
Мейсон Уилер

37

Эти два понятия связаны, но различны.

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

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

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

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

Безусловно, самый известный пример непараллельного параллелизма - это то, как работает JavaScript: существует только один поток, и любой асинхронный обратный вызов должен ждать до завершения выполнения предыдущего фрагмента кода. Это важно знать, потому что это гарантирует, что любая функция, которую вы пишете, является атомарной - никакой обратный вызов не может прервать ее, пока она не вернется. Но это также означает, что «занятые циклы» не будут работать - вы не можете установить тайм-аут, а затем цикл, пока он не сработает, потому что цикл будет препятствовать выполнению обратного вызова тайм-аута.


8
Вы говорите это, Concurrency means that two or more calculations happen within the same time frame, and there is usually some sort of dependency between them.но пользователь, который написал этот принятый ответ, говорит Concurrency means, essentially, that task A and task B both need to happen independently of each other. Так какой вывод?
Nbro

Не могли бы вы объяснить, почему модель JavaScript является параллельной? Согласно вашему определению параллелизма, два или более вычислений должны происходить в один и тот же период времени. Но в JavaScript вычисления последовательно упорядочиваются с использованием одной очереди.
Дамлуар

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

9

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


Параллельность: свойство системы, позволяющее выполнять элементы программы, алгоритма или задачи не по порядку или по частям, не влияя на конечный результат 1 2 .

Простой пример этого - последовательные добавления:

0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 = 45

Из-за коммутативного свойства сложения их порядок может быть переставлен без ущерба для корректности; следующая договоренность приведет к тому же ответу:

(1 + 9) + (2 + 8) + (3 + 7) + (4 + 6) + 5 + 0 = 45

Здесь я сгруппировал числа в пары, которые составят 10, чтобы мне было легче найти правильный ответ в моей голове.

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

Продолжая пример последовательных дополнений, мы можем выполнить разные части суммы параллельно:

Execution unit 1:  0 + 1 + 2 + 3 + 4 = 10
Execution unit 2:  5 + 6 + 7 + 8 + 9 = 35

Затем в конце мы суммируем результаты от каждого работника, чтобы получить 10 + 35 = 45.

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

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


неразбериха

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

  • Одновременный: происходящий или существующий одновременно или рядом 5 .
  • Параллелизм: факт двух или более событий или обстоятельств, происходящих или существующих одновременно. От поиска в Google: "define: параллелизм" .

Словарь определяет «параллелизм» как факт возникновения, в то время как определение в вычислительном языке является скрытым свойством программы, свойства или системы. Хотя связаны эти вещи не то же самое.


Личные рекомендации

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

Поэтому я бы описал моделирование реактивного двигателя на нескольких ядрах как параллельное.

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


6

Параллельное выполнение - это обобщенная форма параллельного выполнения. Например, параллельную программу также можно назвать параллельной, но обратная неверна.

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

Подробнее читайте в этой статье « Концепции параллельного программирования».


1
«Параллельное выполнение невозможно на одном процессоре, но на нескольких процессорах» - за исключением, конечно, случаев, когда существуют параллельные пути выполнения внутри процессора, например, системы, использующие параллелизм на уровне команд (так называемые «суперскалярные» архитектуры, например процессоры Intel, поскольку Pentium, ARM Cortex и большинство других высокопроизводительных процессоров) и Single Instruction Multiple Data, также известные как параллельные архитектуры данных (например, MMX / SSE / и т. д.). Не говоря уже об экзотических механизмах, таких как процессоры потоков данных и так далее.
Жюль

3

Параллельная обработка является подмножеством параллельной обработки.

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

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


0

Заявление tdammer близко, все остальное не имеет смысла. Он говорит:

«Проще говоря, параллелизм описывает проблему (две вещи должны происходить вместе), а параллелизм описывает решение (два ядра процессора используются для одновременного выполнения двух вещей»)

Давайте просто проанализируем слова.

Текущее означает происходящее сейчас, актуальное, актуальное в данный момент. Против означает против, против, не выравнивая с.

Параллель означает в одном направлении, не пересекаясь, не находясь на пути друг друга.

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


«Текущее означает происходящее сейчас, актуальное, актуальное в данный момент. Против означает против, противостоит, не выравнивая». - нужна цитата. Я сильно сомневаюсь в обоих этих утверждениях. В то время как «текущий» может иметь значение, упомянутое здесь на английском языке, это не значение, используемое в слове «одновременный»
Халк

1
Я думаю, что перевод параллельного с латыни "бежать вместе". Приставка «con» часто означает вместе , как в заговоре (чтобы вместе дышать) следствие (результаты вместе или следование) заключают (близко друг к другу) и т. Д. Это раздражающий аспект языка, что что-то может иметь противоположные значения, санкция - мой любимый пример ,

@no comprende В этом случае (в параллельном режиме) значение «работать вместе» действительно лучше подходит. Поскольку нет текущего ... В голландском языке слово concurrent является конкурентом, означающим существительное. Курант обычен, двигается вокруг вас. Это также газета. То, что сейчас активно. «Rekening Courant» - это действующий аккаунт. Я чувствую, что параллелизм подразумевает кон (!) Флик. Борьба за тот же ресурс. Бег в том же пространстве. Возможно из-за голландского значения (конкурент).
Мартин Маат

Интересно, что скажет Дейкстра?

-1

Очевидно, что термины используются по-разному в разных культурах.

Я понимаю следующее:

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

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

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


-1

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

Мейсон Уилер и Пингвин дали один и тот же ответ. Одно ядро ​​с переключением задач и / или многоядерностью является параллельным, строго многоядерным = параллельным.

Мое мнение таково, что эти два термина должны быть объединены, и я стараюсь не говорить «одновременно». Я предполагаю, что на уровне программирования ОС это различие важно, но с точки зрения программиста приложений это не имеет большого значения. Я написал mapReduce, Spark, MPI, cuda, openCL и многопоточный c ++, и мне никогда не приходилось останавливаться и думать, выполняется ли задание с чередующимися потоками или с несколькими ядрами.

Например, когда я пишу многопоточный c ++, иногда я не уверен, сколько ядер я получу, хотя есть способы предъявлять требования к количеству ядер, которые вы можете получить, как описано здесь https://stackoverflow.com/questions/2166425/ как структурировать приложение для использования в многоядерном процессоре . В spark я просто отображаю и сокращаю операции и не знаю, как jvm обрабатывает их на аппаратном уровне. На графических процессорах я думаюкаждый поток назначен на свой собственный простой процессор, но я всегда синхронизирую свои потоки везде, где может возникнуть проблема. С помощью MPI связь между машинами указывается явно, но мы можем чередовать функции, выполняющиеся на нескольких машинах, на одном ядре и объединять результаты с помощью соответствующей однопоточной функции. А что если мы используем MPI для координации группы одноядерных машин, каждая из которых имеет многопоточность? Что это меняет? Я бы сказал, нет. Назовите все это «параллельно» и покончите с этим.


2
Различие все еще актуально сегодня. Вы можете иметь параллелизм только до количества ядер ЦП, которое имеется на вашем оборудовании, однако во многих программах одновременно выполняются сотни одновременных вычислений, намного больше, чем количество ядер, имеющихся на аппаратном обеспечении. Непонимание этого различия может привести к тому, что программисты не поймут, почему их параллельные программы работают медленнее, чем их однопоточная версия (или небольшое количество потоков).
Ли Райан
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.