В чем разница между параллелизмом и параллелизмом?
В чем разница между параллелизмом и параллелизмом?
Примеры приветствуются.
41 ответ
Параллельность - это когда две или более задач могут запускаться, выполняться и завершаться в перекрывающиеся периоды времени. Это не обязательно означает, что они оба будут работать одновременно. Например, многозадачность на одноядерной машине.
Параллелизм - это когда задачи выполняются буквально одновременно, например, на многоядерном процессоре.
Цитирую руководство по многопоточному программированию от Sun:
Параллельность: условие, которое существует, когда по крайней мере два потока достигают прогресса. Более обобщенная форма параллелизма, которая может включать в себя квантование времени как форму виртуального параллелизма.
Параллельность: условие, которое возникает, когда по крайней мере два потока выполняются одновременно.
Почему путаница существует
Путаница существует, потому что значения обоих слов в словаре почти одинаковы:
- Параллельный: существующий, происходящий или выполненный одновременно (dictionary.com)
- Параллельно: очень похоже и часто происходит одновременно (Merriam Webster).
Однако то, как они используются в информатике и программировании, совершенно иное. Вот моя интерпретация:
- Параллельность: прерывистость
- Параллелизм: независимость
Так что я имею в виду под определениями выше?
Я поясню с реальной аналогией. Допустим, вы должны выполнить 2 очень важных задачи за один день:
- Получить паспорт
- Подготовьте презентацию
Теперь проблема в том, что задача 1 требует, чтобы вы пошли в чрезвычайно бюрократическое правительственное учреждение, которое заставляет вас ждать 4 часа в очереди, чтобы получить свой паспорт. Между тем, задача-2 требуется вашим офисом, и это критически важная задача. Оба должны быть закончены в определенный день.
Случай 1: последовательное выполнение
Обычно вы едете в паспортный стол на 2 часа, ждете в очереди 4 часа, выполняете задание, возвращаетесь на два часа назад, возвращаетесь домой, оставаетесь еще 5 часов и готовитесь к презентации.
Случай 2: одновременное выполнение
Но ты умный. Вы планируете заранее. Вы носите с собой ноутбук и, ожидая в очереди, начинаете работать над презентацией. Таким образом, как только вы вернетесь домой, вам просто нужно работать 1 дополнительный час вместо 5.
В этом случае обе задачи выполняются вами по частям. Вы прервали задание на паспорт во время ожидания в очереди и работали над презентацией. Когда позвонили по вашему номеру, вы прервали задание на презентацию и переключились на задание на паспорт. Экономия времени была по существу возможна благодаря прерыванию обеих задач.
Параллелизм, IMO, должен рассматриваться как "изоляция" в свойствах ACID базы данных. Две транзакции базы данных удовлетворяют требованию изоляции, если вы выполняете подтранзакции в каждой чередованным способом, и конечный результат такой же, как если бы две задачи выполнялись последовательно. Помните, что как для паспортных, так и для презентационных задач вы являетесь единственным исполнителем.
Случай 3: Параллельное выполнение
Теперь, так как вы такой умный парень, вы, очевидно, выше, и у вас есть помощник. Поэтому, прежде чем уйти, чтобы начать задание на паспорт, позвоните ему и скажите, чтобы он подготовил первый проект презентации. Вы тратите весь свой день и заканчиваете задание на паспорт, возвращаетесь и видите свои письма, и вы находите черновик презентации. Он проделал довольно солидную работу и с некоторыми правками еще через 2 часа, вы дорабатываете.
Теперь, так как ваш помощник такой же умный, как и вы, он мог работать над ним независимо, без необходимости постоянно просить вас дать разъяснения. Таким образом, из-за независимости задач, они выполнялись одновременно двумя разными исполнителями.
Все еще со мной? Хорошо...
Случай 4: одновременно, но не параллельно
Помните свое паспортное задание, где вы должны ждать в очереди? Поскольку это ваш паспорт, ваш помощник не может ждать вас в очереди. Таким образом, задание на паспорт имеет возможность прерывания (вы можете остановить его во время ожидания в очереди и возобновить его позже, когда будет набран ваш номер), но не может быть независимым (ваш помощник не может ждать вместо вас).
Случай 5: параллельно, но не одновременно
Предположим, что в правительственном учреждении есть проверка безопасности для входа в помещение. Здесь вы должны удалить все электронные устройства и передать их сотрудникам, и они вернут ваши устройства только после того, как вы выполните свою задачу.
В этом случае задача паспорта не является ни независимой, ни прерываемой. Даже если вы ждете в очереди, вы не можете работать над чем-то другим, потому что у вас нет необходимого оборудования.
Точно так же, скажем, презентация настолько математическая по своей природе, что вам требуется 100% концентрация в течение как минимум 5 часов. Вы не можете сделать это, ожидая очереди на паспорт, даже если у вас есть ноутбук.
В этом случае задание на презентацию является независимым (вы или ваш помощник можете приложить 5 часов целенаправленных усилий), но оно не может быть прервано.
Случай 6: параллельное и параллельное выполнение
Теперь предположим, что помимо назначения помощника на презентацию, вы также носите с собой ноутбук для выполнения паспортного задания. При ожидании в очереди вы видите, что ваш помощник создал первые 10 слайдов в общей колоде. Вы отправляете комментарии к его работе с некоторыми исправлениями. Позже, когда вы вернетесь домой, вместо 2 часов, чтобы доработать проект, вам просто понадобится 15 минут.
Это стало возможным, потому что задача презентации имеет независимость (любой из вас может это сделать) и возможность прерывания (вы можете остановить ее и возобновить позже). Таким образом, вы одновременно выполняли обе задачи и параллельно выполняли задачу представления.
Скажем так, в дополнение к чрезмерной бюрократии правительственный орган коррумпирован. Таким образом, вы можете показать свою идентификацию, ввести ее, начать ждать в очереди для вызова вашего номера, подкупить охранника и кого-то еще, чтобы удержать вашу позицию в линии, улизнуть, вернуться до того, как ваш номер будет вызван, и возобновить ожидание сам.
В этом случае вы можете выполнять как паспортные, так и презентационные задачи одновременно и параллельно. Вы можете улизнуть, и ваша позиция удерживается вашим помощником. Затем вы оба можете работать над презентацией и т. Д.
Вернуться к информатике
В вычислительном мире приведены примеры сценариев, типичных для каждого из этих случаев:
- Случай 1: обработка прерываний.
- Случай 2: когда есть только один процессор, но все выполняющиеся задачи имеют время ожидания из-за ввода-вывода.
- Случай 3: часто встречается, когда мы говорим о кластерах с уменьшением карты или hadoop.
- Случай 4: Я думаю, что Случай 4 редок. Нередко задача выполняется одновременно, но не параллельно. Но это может случиться. Например, предположим, что для вашей задачи требуется доступ к специальному вычислительному чипу, доступ к которому возможен только через процессор-1. Таким образом, даже если процессор-2 свободен, а процессор-1 выполняет какую-то другую задачу, специальная вычислительная задача не может продолжаться на процессоре-2.
- Случай 5: также редкий, но не такой редкий, как случай 4. Непоследовательный код может быть критической областью, защищенной мьютексами. Как только он запущен, он должен выполняться до завершения. Однако две разные критические области могут развиваться одновременно на двух разных процессорах.
- Случай 6: IMO, большинство дискуссий о параллельном или параллельном программировании в основном говорят о случае 6. Это сочетание и сопоставление как параллельных, так и параллельных выполнений.
Параллелизм и Go
Если вы понимаете, почему Роб Пайк говорит, что параллелизм лучше, вы должны понять, что причина в этом. У вас очень длинная задача, в которой есть несколько периодов ожидания, когда вы ожидаете некоторых внешних операций, таких как чтение файла, загрузка по сети. В своей лекции все, что он говорит, это "просто разбейте эту длинную последовательную задачу, чтобы вы могли сделать что-то полезное, пока ждете". Вот почему он говорит о разных организациях с разными сусликами.
Теперь сила Go заключается в том, чтобы сделать этот прорыв действительно легким go
Ключевое слово и каналы. Кроме того, есть отличная базовая поддержка во время выполнения для планирования этих подпрограмм.
Но по сути, параллелизм лучше параллелизма?
Яблоки предпочитают больше, чем апельсины?
Мне нравится выступление Роба Пайка: параллелизм - это не параллелизм (это лучше!) (Слайды) (доклад)
Роб обычно говорит о Go и обычно рассматривает вопрос о параллелизме и параллелизме в визуальном и интуитивном объяснении! Вот краткое резюме:
Задача: Давайте сожжем кучу устаревших языковых пособий! Один за раз!
Параллелизм: Есть много одновременных декомпозиций задачи! Один пример:
Параллелизм: предыдущая конфигурация происходит параллельно, если одновременно работают как минимум 2 суслика или нет.
Скажем, у вас есть программа, которая имеет два потока. Программа может работать двумя способами:
Concurrency Concurrency + parallelism
(Single-Core CPU) (Multi-Core CPU)
___ ___ ___
|th1| |th1|th2|
| | | |___|
|___|___ | |___
|th2| |___|th2|
___|___| ___|___|
|th1| |th1|
|___|___ | |___
|th2| | |th2|
В обоих случаях мы имеем параллелизм из-за того факта, что у нас запущено более одного потока.
Если бы мы запустили эту программу на компьютере с одним ядром ЦП, ОС переключалась бы между двумя потоками, позволяя запускать один поток за раз.
Если бы мы запустили эту программу на компьютере с многоядерным процессором, мы бы смогли запустить два потока параллельно - бок о бок в одно и то же время.
Чтобы добавить к тому, что сказали другие:
Параллелизм подобен тому, как жонглер манипулирует многими шарами. Независимо от того, как это кажется, жонглер ловит / бросает только один мяч за руку за раз. Параллелизм - это одновременное жонглирование шарами нескольких жонглеров.
Представьте, что вы изучаете новый язык программирования, посмотрев видеоурок. Вам нужно приостановить видео, применить то, что было сказано в коде, а затем продолжить просмотр. Это параллелизм.
Теперь вы профессиональный программист. И вам нравится слушать спокойную музыку во время кодирования. Это параллелизм.
Наслаждаться.
Параллельность: если две или более проблем решаются одним процессором.
Параллельность: если одна проблема решается несколькими процессорами.
Я постараюсь объяснить на интересном и понятном примере.:)
Предположим, что организация организует шахматный турнир, в котором 10 игроков (с равными навыками игры в шахматы) сразятся с профессиональным шахматистом- чемпионом. А поскольку шахматы - это игра 1: 1, организаторам необходимо провести 10 игр в срок, чтобы они могли как можно быстрее закончить все соревнование.
Надеемся, что следующие сценарии легко опишут несколько способов проведения этих 10 игр:
1) СЕРИЙНЫЙ - допустим, что профессионал играет с каждым человеком один за другим, то есть начинает и заканчивает игру с одним человеком, а затем начинает следующую игру со следующим человеком и так далее. Другими словами, они решили проводить игры последовательно. Таким образом, если для завершения одной игры требуется 10 минут, то для 10 игр потребуется 100 минут, а также предположим, что переход из одной игры в другую занимает 6 секунд, тогда для 10 игр это будет 54 секунды (около 1 минуты).
Таким образом, все мероприятие будет завершено примерно за 101 минуту (WORST APPROACH)
2) CONCURRENT - допустим, что профессионал играет свой ход и переходит к следующему игроку, поэтому все 10 игроков играют одновременно, но у профессионального игрока нет двух игроков одновременно, он играет свой ход и переходит к следующему игроку. Теперь предположим, что профессиональному игроку требуется 6 секунд, чтобы сыграть свой ход, а также время перехода профессионального игрока в ч / б двух игроков составляет 6 секунд, поэтому общее время перехода к первому игроку будет 1 минута (10x6 секунд). Следовательно, к тому времени, когда он возвращается к первому человеку, с которым было начато событие, прошло 2 минуты (10xtime_per_turn_by_champion + 10xtransition_time=2 минуты)
Предполагая, что всем игрокам нужно 45 секунд, чтобы завершить свой ход, так что на основе 10 минут на игру от события SERIAL нет. раундов до окончания игры должно 600/(45+6) = 11 раундов (приблизительно)
Таким образом, все событие будет приблизительно завершено через 11xtime_per_turn_by_player_&_champion + 11xtransition_time_across_10_players = 11x51 + 11x60sec= 561 + 660 = 1221sec = 20,35 минут (приблизительно)
ПОСМОТРЕТЬ УЛУЧШЕНИЕ от 101 до 20,35 минут (ЛУЧШИЙ ПОДХОД)
3) ПАРАЛЛЕЛЬ - скажем, организаторы получают дополнительные средства и поэтому решили пригласить двух профессиональных игроков-чемпионов (оба одинаково способные) и разделили набор из 10 одинаковых игроков (претендентов) на две группы по 5 человек и назначили их двум чемпионам, т.е. одному группа каждого. Теперь событие развивается параллельно в этих двух сетах, то есть как минимум два игрока (по одному в каждой группе) играют против двух профессиональных игроков в соответствующей группе.
Однако в группе профессиональный игрок берет по одному игроку за раз (т.е. последовательно), поэтому без каких-либо вычислений вы можете легко определить, что все событие будет приблизительно завершено за 101/2=50,5 минут до завершения.
ПОСМОТРЕТЬ УЛУЧШЕНИЕ от 101 минуты до 50,5 минут (ХОРОШИЙ ПОДХОД)
4) CONCURRENT + PARALLEL - В приведенном выше сценарии предположим, что два чемпиона будут играть одновременно (читай 2-е очко) с 5 игроками в их соответствующих группах, так что теперь игры между группами идут параллельно, но внутри группы они работают одновременно.
Таким образом, игры в одной группе будут примерно завершены через 11xtime_per_turn_by_player_&_champion + 11xtransition_time_across_5_players = 11x51 + 11x30 = 600 + 330 = 930сек = 15,5 минут (приблизительно)
Таким образом, все мероприятие (с участием двух таких параллельно работающих групп) будет приблизительно завершено за 15,5 минут.
ПОСМОТРЕТЬ УЛУЧШЕНИЕ от 101 до 15,5 минут (ЛУЧШИЙ ПОДХОД)
ПРИМЕЧАНИЕ: в приведенном выше сценарии, если вы замените 10 игроков с 10 одинаковыми рабочими местами и двух профессиональных игроков с двумя ядрами ЦП, то снова будет выполняться следующий порядок:
SERIAL> PARALLEL> CONCURRENT> CONCURRENT + PARALLEL
(ПРИМЕЧАНИЕ: этот порядок может измениться для других сценариев, так как этот порядок сильно зависит от взаимозависимости заданий, коммуникационных потребностей ч / б заданий и накладных расходов переходного периода ч / б)
Выполнение параллельного программирования имеет 2 типа: непараллельное параллельное программирование и параллельное параллельное программирование (также известное как параллелизм).
Ключевое отличие состоит в том, что для человеческого глаза потоки в параллельном параллельном режиме, кажется, работают одновременно, но на самом деле это не так. В непараллельных потоках параллелизма быстро переключаются и по очереди используют процессор через квантование времени. В параллелизме доступно несколько процессоров, поэтому несколько потоков могут работать на разных процессорах одновременно.
Простой пример:
Одновременно: "Две очереди обращаются к одному банкомату"
Параллель есть: "Две очереди и два банкомата"
Параллелизм - это одновременное выполнение процессов на multiple cores per CPU
или же multiple CPUs (on a single motherboard)
,
Параллелизм - это когда параллелизм достигается на single core CPU
используя алгоритмы планирования, которые делят время процессора (временной интервал). Процессы чередуются.
Единицы:
- 1 или много ядер в процессоре (почти все современные процессоры)
- 1 или много процессоров на материнской плате (вспомните серверы старой школы)
- 1 программа может иметь 1 или несколько потоков исполнения
- 1 процесс может иметь 1 или несколько потоков из 1 программы (например, для выполнения ряда Фибоначчи для очень большого числа)
- 1 программа может иметь 1 или несколько процессов (думаю, что каждое окно браузера Chrome является процессом)
- 1 процесс
thread(s)+allocated memory by OS
(куча, регистры, стек, память классов)
Они решают разные проблемы. Параллелизм решает проблему нехватки ресурсов процессора и множества задач. Таким образом, вы создаете потоки или независимые пути выполнения через код, чтобы разделить время на дефицитном ресурсе. До недавнего времени параллелизм доминировал в обсуждении из-за доступности ЦП.
Параллелизм решает проблему поиска достаточного количества задач и соответствующих задач (которые можно правильно разделить) и распределения их по обильным ресурсам ЦП. Параллелизм, конечно, всегда был вокруг, но он выходит на первый план, потому что многоядерные процессоры очень дешевы.
Concurency: несколько потоков выполнения с возможностью совместного использования ресурсов
Пример: два потока, конкурирующие за порт ввода / вывода.
паралелизм: разбиение задачи на несколько похожих кусков.
Пример: парсинг большого файла путем запуска двух процессов в каждой половине файла.
Параллельность => Когда несколько задач выполняются в перекрывающиеся периоды времени с общими ресурсами (что потенциально максимизирует использование ресурсов).
Параллельно => когда одна задача делится на несколько простых независимых подзадач, которые могут выполняться одновременно.
Параллелизм
В своем докладе «Конкуренция — это не параллелизм» Роб Пайк определяет параллелизм как работу с множеством вещей одновременно.
Возьмем, к примеру, три задачи¹ T1, T2 и T3, выполняемые на одном процессоре.
В каждый момент времени (как показано зелеными вертикальными линиями) ЦП выполняет одну задачу, т. е. некоторое время выполняется T1, затем T2, затем T1, затем T3 и так далее и так далее. Однако переключение контекста между задачами происходит настолько быстро, что человеку-наблюдателю кажется, что ЦП выполняет три задачи одновременно. В действительности задачи выполняются (как показано серыми горизонтальными линиями), хотя в любой момент времени ЦП выполняет одну задачу. Все выполнения задач чередуются и , таким образом, выполняются одновременно.
Теперь у нас есть три задачи, которые смоделированы для одновременного выполнения на одном процессоре. Что бы произошло, если бы у нас было три ядра процессора вместо одного? Вот тут-то и возникает параллелизм.
Параллелизм
Пайк определяет параллелизм как выполнение множества задач одновременно . Параллелизм — это подмножество параллелизма, которое обеспечивается аппаратным обеспечением, при котором все задачи не только выполняются, но и выполняются одновременно.
Например, если бы у нас было три ядра ЦП и мы поместили каждую из предыдущих задач на отдельное ядро ЦП, то они бы выполнялись параллельно друг другу.
Каждое ядро ЦП выполняет одну задачу и продолжает выполнять ее все время без переключения контекста, поэтому все три задачи выполняются буквально одновременно. Когда T1 что-то делает, то же самое делают T2 и T3. Опять же, T1, T2 и T3 выполняются параллельно.
Теперь параллелизм и параллелизм не являются взаимоисключающими, вы также можете использовать параллельный параллелизм.
Параллельный параллелизм
Параллельное выполнение позволяет добиться прогресса в выполнении более чем одной задачи (по-видимому, одновременно) на более чем одном процессоре. Давайте представим, что у нас есть только два ядра ЦП, но мы сохраняем то же количество задач, что и раньше. Тогда одна из возможных конфигураций будет состоять из двух задач, выполняемых на одном ядре ЦП, и еще одной задачи, выполняемой на другом ядре ЦП.
В этом примере задачи T1 и T3 выполняются одновременно по отношению друг к другу на первом ЦП, тогда как задача T2 выполняется полностью параллельно по отношению к T1 или T3. Почему не Т1 и Т3? Потому что первый ЦП в любой момент времени выполняет одну задачу. Таким образом, в какой-то момент времени T2 работает параллельно с T1, затем T2 работает параллельно с T3 и так далее.
Краткое содержание
Параллелизм предполагает работу со многими вещами одновременно , а параллелизм – это выполнение множества задач одновременно .
Параллелизм — это разновидность параллелизма . Если задачи не декомпозированы для одновременного выполнения на одном ЦП, они потенциально не могут выполняться параллельно. даже при наличии доступного оборудования, позволяющего это сделать.
Параллелизм невозможен, если он не включен аппаратным обеспечением. Если у вас нет более одного ядра ЦП, вы не сможете распараллеливать одновременные задачи.
Параллелизм и параллелизм не являются взаимоисключающими , и оба они не обязательно должны присутствовать. Приложение может быть
- параллельный, но не параллельный , например, он разбит на параллельные задачи, но есть только один процессор.
- параллельно, но не одновременно , например, количество задач равно количеству ядер ЦП, поэтому каждая задача выполняется параллельно друг другу.
- как параллельные, так и параллельные , например, он разбит на параллельные задачи, но для каждой отдельной задачи недостаточно ядер ЦП.
- ни параллельный, ни параллельный , например, одно ядро ЦП, и приложение не разбивается на отдельные параллельные задачи.
¹ Я использую слово « задача» для обозначения как процессов, так и потоков.
Думайте об этом как об обслуживании очередей, когда сервер может обслуживать только 1-е задание в очереди.
1 сервер, 1 очередь заданий (с 5 заданиями) -> нет параллелизма, нет параллелизма (до завершения обслуживается только одно задание, следующее задание в очереди должно ждать, пока не будет выполнено обслуживаемое задание, и нет другого сервера для обслуживай это)
1 сервер, 2 или более разных очередей (по 5 заданий в очереди) -> параллелизм (поскольку сервер делит время со всеми первыми заданиями в очередях, одинаково или взвешенно), параллелизма по-прежнему нет, так как в любой момент времени есть один и только работа обслуживается.
2 или более серверов, одна Очередь -> параллелизм ( 2 задания выполняются одновременно), но нет параллелизма (сервер не разделяет время, третье задание должно ждать, пока один из серверов не завершится).
2 или более серверов, 2 или более разных очередей -> параллелизм и параллелизм
Другими словами, параллелизм - это разделение времени на выполнение задания, оно МОЖЕТ занимать то же время, чтобы завершить задание, но, по крайней мере, оно начинается рано. Важно то, что рабочие места могут быть разделены на более мелкие рабочие места, что позволяет чередовать.
Параллельность достигается с помощью большего количества процессоров, серверов, людей и т. Д., Которые работают параллельно.
Имейте в виду, что при совместном использовании ресурсов невозможно достичь чистого параллелизма, но именно в этом случае параллелизм будет иметь наилучшее практическое применение, если он займется другой работой, которая не нуждается в этом ресурсе.
Мне очень нравится ответ Пола Мясника на этот вопрос (он - автор " Семи моделей параллелизма за семь недель"):
Хотя они часто путаются, параллелизм и параллелизм - это разные вещи. Параллельность является аспектом проблемной области - ваш код должен обрабатывать несколько одновременных (или почти одновременных) событий. Параллелизм, напротив, является аспектом области решения- вы хотите, чтобы ваша программа работала быстрее, обрабатывая различные части проблемы параллельно. Некоторые подходы применимы к параллелизму, некоторые к параллелизму, а некоторые к обоим. Поймите, с чем вы столкнулись, и выберите правильный инструмент для работы.
Я собираюсь предложить ответ, который немного конфликтует с некоторыми из популярных ответов здесь. На мой взгляд, параллелизм - это общий термин, включающий параллелизм. Параллелизм применяется к любой ситуации, когда различные задачи или единицы работы перекрываются во времени. Параллелизм более конкретно применяется к ситуациям, когда отдельные единицы работы оцениваются / выполняются в одно и то же физическое время. Причиной параллелизма является ускорение работы программного обеспечения, которое может использовать множество физических вычислительных ресурсов. Другой основной концепцией, которая подходит под параллелизм, является интерактивность. Интерактивность применяется, когда перекрытие задач наблюдается из внешнего мира. Смысл интерактивности заключается в создании программного обеспечения, которое реагирует на реальные объекты, такие как пользователи, сетевые коллеги, аппаратные периферийные устройства и т. Д.
Параллелизм и интерактивность являются почти полностью независимым измерением параллелизма. Для конкретного проекта разработчики могут заботиться о том или другом, или обоих. Они имеют тенденцию смешиваться, не в последнюю очередь потому, что мерзость, которая представляет собой нити, дает достаточно удобный примитив для выполнения того и другого.
Немного подробнее о параллелизме:
Параллелизм существует в очень малых масштабах (например, параллелизм на уровне команд в процессорах), средних масштабах (например, многоядерные процессоры) и больших масштабах (например, высокопроизводительные вычислительные кластеры). В последние годы усилилось давление на разработчиков программного обеспечения с целью раскрытия большего параллелизма на уровне потоков из-за роста многоядерных процессоров. Параллелизм тесно связан с понятием зависимости. Зависимости ограничивают степень, в которой может быть достигнут параллелизм; две задачи не могут выполняться параллельно, если одна зависит от другой (игнорирование спекуляций).
Существует множество шаблонов и структур, которые программисты используют для выражения параллелизма: конвейеры, пулы задач, агрегатные операции над структурами данных ("параллельные массивы").
Немного подробнее о интерактивности:
Наиболее простой и распространенный способ интерактивности - это события (т. Е. Цикл обработки событий и обработчики / обратные вызовы). Для простых задач отлично подходят события. Попытка выполнить более сложные задачи с событиями приводит к разрыву стека (он же называется обратным вызовом ада; он же инверсия управления). Когда вы устали от событий, вы можете попробовать более экзотические вещи, такие как генераторы, сопрограммы (иначе Async/Await) или совместные потоки.
Из-за любви к надежному программному обеспечению, пожалуйста, не используйте темы, если вы хотите интерактивности.
Curmudgeonliness
Мне не нравится лозунг Роба Пайка "параллелизм; это лучше". Параллелизм не лучше и не хуже параллелизма. Параллельность включает в себя интерактивность, которую нельзя сравнивать лучше / хуже с параллелизмом. Это как сказать "поток управления лучше, чем данные".
Из книги Роберта Лава " Системное программирование Linux ":
Параллелизм, параллелизм и гонки
Потоки создают два связанных, но разных явления: параллелизм и параллелизм. Оба они горько-сладкие, они касаются затрат на нарезку нитей, а также ее преимуществ. Параллелизм - это способность двух или более потоков выполняться в перекрывающиеся периоды времени. Параллелизм является способность выполнять две или несколько потоков одновременно. Параллелизм может происходить без параллелизма: например, многозадачность в однопроцессорной системе. Параллелизм (иногда подчеркивается какистинный параллелизм) - это особая форма параллелизма, требующая нескольких процессоров (или одного процессора, способного выполнять несколько механизмов, таких как графический процессор). При одновременном выполнении несколько потоков продвигаются вперед, но не обязательно одновременно. Благодаря параллелизму потоки буквально выполняются параллельно, что позволяет многопоточным программам использовать несколько процессоров.
Параллелизм - это шаблон программирования, способ решения проблем. Параллелизм - это аппаратная функция, достижимая за счет параллелизма. Оба полезны.
Это объяснение согласуется с принятым ответом. На самом деле концепции намного проще, чем мы думаем. Не считайте их волшебством. Параллелизм - это период времени, а параллелизм - примерно в одно и то же время, одновременно.
В электронике последовательные и параллельные представляют собой тип статической топологии, определяющей фактическое поведение схемы. Когда нет параллелизма, параллелизм является детерминированным.
Чтобы описать динамические, связанные со временем явления, мы используем термины последовательный и параллельный. Например, определенный результат может быть получен с помощью определенной последовательности задач (например, рецепт). Когда мы говорим с кем-то, мы производим последовательность слов. Однако в действительности многие другие процессы происходят в один и тот же момент и, таким образом, совпадают с фактическим результатом определенного действия. Если много людей разговаривают одновременно, параллельные разговоры могут мешать нашей последовательности, но результаты этого вмешательства заранее неизвестны. Параллельность вводит неопределенность.
Последовательная / параллельная и последовательная / параллельная характеристика являются ортогональными. Примером этого является цифровая связь. В последовательном адаптере цифровое сообщение временно (т.е. последовательно) распределяется по той же линии связи (например, по одному проводу). В параллельном адаптере это делится также на параллельные линии связи (например, на множество проводов), а затем реконструируется на приемном конце.
Давайте представим игру с 9 детьми. Если мы разместим их в виде цепочки, дадим сообщение первым и получим его в конце, у нас будет последовательная связь. Больше слов составляют сообщение, состоящее из последовательности коммуникационных единств.
I like ice-cream so much. > X > X > X > X > X > X > X > X > X > ....
Это последовательный процесс, воспроизводимый в последовательной инфраструктуре.
Теперь давайте представим, что нужно разделить детей на группы по 3. Мы разделим фразу на три части: сначала дадим дочернего элемента линии слева от нас, второго - дочернего элемента центральной линии и т. Д.
I like ice-cream so much. > I like > X > X > X > .... > ....
> ice-cream > X > X > X > ....
> so much > X > X > X > ....
Это последовательный процесс, воспроизводимый в параллельной инфраструктуре (хотя и частично частично сериализованный).
В обоих случаях, если между детьми существует идеальное общение, результат определяется заранее.
Если есть другие люди, которые разговаривают с первым ребенком одновременно с вами, то у нас будут параллельные процессы. Мы не знаем, какой процесс будет рассматриваться инфраструктурой, поэтому окончательный результат заранее не определен.
Параллельность - это обобщенная форма параллелизма. Например, параллельную программу также можно назвать параллельной, но обратная неверна.
Одновременное выполнение возможно на одном процессоре (несколько потоков, управляемых планировщиком или пулом потоков)
Параллельное выполнение невозможно на одном процессоре, но на нескольких процессорах. (Один процесс на процессор)
Распределенные вычисления также являются связанной темой, и их также можно назвать параллельными вычислениями, но обратное неверно, как параллелизм.
Подробнее читайте в этой статье " Концепции параллельного программирования".
Мне очень понравилось это графическое представление из другого ответа - я думаю, что оно отвечает на вопрос гораздо лучше, чем многие из приведенных выше ответов.
Параллельность против параллелизма Когда два потока работают параллельно, они оба работают одновременно. Например, если у нас есть два потока, A и B, их параллельное выполнение будет выглядеть так:
CPU 1: A ------------------------->
CPU 2: B ------------------------->
Когда два потока работают одновременно, их выполнение перекрывается. Перекрытие может происходить одним из двух способов: либо потоки выполняются в одно и то же время (т.е. параллельно, как указано выше), либо их исполнения чередуются на процессоре, например так:
CPU 1: A -----------> B ----------> A -----------> B -------- ->
Таким образом, для наших целей параллелизм можно рассматривать как особый случай параллелизма
Источник: еще один ответ здесь
Надеюсь, это поможет.
"Параллельно" - это делать что угодно - одновременно - одновременно. Это могут быть разные вещи или одно и то же. Несмотря на принятый ответ, которого нет, речь идет не о том, чтобы "показаться одновременно". Это действительно в то же время. Вам нужно несколько ядер ЦП, использующих совместно используемую память на одном хосте или распределенную память на разных хостах, для запуска параллельного кода. В качестве примера можно привести конвейеры из 3-х различных задач, которые одновременно выполняются одновременно: Задача-уровень 2 должна ожидать выполнения единиц, завершенных задачей уровня-1, а задача-уровень-3 должна ожидать выполнения единиц работы, завершенных задача уровня-2. Другой пример - параллелизм одного производителя с одним потребителем; или много производителей и 1 потребитель; читатели и писатели; и другие.
"Параллель" делает одно и то же одновременно. Это одновременно, но, кроме того, это то же самое поведение, происходящее в одно и то же время, и чаще всего это происходит с разными данными. Матричную алгебру часто можно распараллелить, потому что одна и та же операция выполняется многократно: например, суммы столбцов матрицы могут быть вычислены одновременно с использованием одного и того же поведения (суммы), но для разных столбцов. Распространенной стратегией является разделение (разделение) столбцов между доступными ядрами процессора, чтобы у вас было примерно одинаковое количество работы (число столбцов), обрабатываемое каждым ядром процессора. Другой способ разделить работу - это мешок с заданиями, где работники, которые заканчивают свою работу, возвращаются к менеджеру, который раздает работу и динамически получает больше работы, пока все не будет сделано. Алгоритм продажи билетов другой.
Не только числовой код может быть распараллелен. Файлы слишком часто могут обрабатываться параллельно. В приложении обработки естественного языка для каждого из миллионов файлов документов может потребоваться подсчитать количество токенов в документе. Это параллельно, потому что вы подсчитываете токены, что является одинаковым поведением для каждого файла.
Другими словами, параллелизм - это когда одно и то же поведение выполняется одновременно. Одновременно означает в то же время, но не обязательно то же самое поведение. Параллель - это особый вид параллелизма, когда в одно и то же время происходит одно и то же.
Термины, например, будут включать атомарные инструкции, критические секции, взаимное исключение, ожидание вращения, семафоры, мониторы, барьеры, передачу сообщений, сокращение карты, сердцебиение, звонок, алгоритмы создания билетов, потоки, MPI, OpenMP.
Работа Грегори Эндрюса является главным учебником по ней: многопоточное, параллельное и распределенное программирование.
"Параллельность" - это когда происходит несколько вещей.
"Параллелизм" - это когда параллельные вещи развиваются одновременно.
Примеры параллелизма без параллелизма:
- Несколько потоков на одном ядре.
- Несколько сообщений в очереди сообщений Win32.
- множественный
SqlDataReader
с подключением MARS. - Несколько обещаний JavaScript на вкладке браузера.
Обратите внимание, однако, что разница между параллелизмом и параллелизмом часто является вопросом перспективы. Приведенные выше примеры не параллельны с точки зрения (наблюдаемых эффектов) выполнения вашего кода. Но существует параллелизм на уровне инструкций даже внутри одного ядра. Существуют аппаратные средства, выполняющие операции параллельно с процессором, а затем прерывающие работу процессора, когда это будет сделано. Графический процессор может рисовать на экране во время выполнения вашей оконной процедуры или обработчика события. СУБД может обойти B-деревья для следующего запроса, пока вы все еще получаете результаты предыдущего. Браузер может делать макет или сеть, пока ваш Promise.resolve()
выполняется И т. Д., И т. Д.
Итак, поехали. Мир как всегда грязен;)
Самый простой и самый элегантный способ понять два, на мой взгляд, это. Параллелизм позволяет чередовать выполнение и, следовательно, может создавать иллюзию параллелизма. Это означает, что параллельная система может, например, запускать ваше видео на Youtube вместе с написанием документа в Word. Базовая ОС, будучи параллельной системой, позволяет этим задачам чередовать их выполнение. Поскольку компьютеры выполняют инструкции так быстро, создается впечатление, что они выполняют две вещи одновременно.
Параллелизм - это когда такие вещи действительно параллельны. В приведенном выше примере вы можете обнаружить, что код обработки видео выполняется на одном ядре, а приложение Word - на другом. Обратите внимание, что это означает, что параллельная программа также может быть параллельной! Структурирование вашего приложения с потоками и процессами позволяет вашей программе эксплуатировать базовое оборудование и потенциально может выполняться параллельно.
Почему бы не сделать все параллельно? Одна из причин заключается в том, что параллелизм - это способ структурирования программ и проектное решение, облегчающее разделение задач, тогда как параллелизм часто используется во имя производительности. Другое - то, что некоторые вещи принципиально не могут быть полностью выполнены параллельно. Примером этого может быть добавление двух вещей в конец очереди - вы не можете вставить оба одновременно. Что-то должно идти первым, а другое позади, иначе вы испортите очередь. Хотя мы можем чередовать такое выполнение (и поэтому мы получаем параллельную очередь), вы не можете иметь его параллельно.
Надеюсь это поможет!
Параллельность может включать в себя задачи, выполняемые одновременно или нет (они действительно могут выполняться в отдельных процессорах / ядрах, но они также могут выполняться в "тиках"). Важно то, что параллелизм всегда относится к выполнению части одной более важной задачи. Так что в основном это часть некоторых вычислений. Вы должны быть умны в том, что вы можете делать одновременно, а что нет, и как синхронизировать.
Параллелизм означает, что вы просто делаете некоторые вещи одновременно. Они не должны быть частью решения одной проблемы. Ваши темы могут, например, решить одну проблему каждый. Конечно, синхронизация также применима, но с другой точки зрения.
(Я очень удивлен, что такой фундаментальный вопрос не решается правильно и аккуратно в течение многих лет...)
Короче говоря, и параллелизм, и параллелизм являются свойствами вычислений.
Что касается различий, вот объяснение от Роберта Харпера:
Первое, что нужно понять, это то, что параллелизм не имеет ничего общего с параллелизмом. Параллельность связана с недетерминированным составом программ (или их компонентов). Параллелизм связан с асимптотической эффективностью программ с детерминированным поведением. Параллельность - это управление неуправляемым: события происходят по независящим от нас причинам, и мы должны на них реагировать. Пользователь щелкает мышью, оконный менеджер должен ответить, даже если дисплей требует внимания. Такие ситуации по своей природе недетерминированы, но мы также используем формальный недетерминизм в детерминированной обстановке, делая вид, что компоненты сигнализируют о событиях в произвольном порядке, и что мы должны реагировать на них по мере их возникновения. Недетерминированная композиция - это мощная идея структурирования программы. Параллелизм, с другой стороны, все о зависимостях среди подвычислений детерминированного вычисления. Результат не вызывает сомнений, но существует множество способов его достижения, некоторые из которых более эффективны, чем другие. Мы хотим использовать эти возможности в наших интересах.
Они могут быть своего рода ортогональными свойствами в программах. Прочтите этот пост в блоге для дополнительных иллюстраций. И в этом обсуждалось немного больше различий в компонентах программирования, таких как потоки.
Обратите внимание, что многопоточность или многозадачность - все это реализации вычислений, служащие более конкретным целям. Они могут быть связаны с параллелизмом и параллелизмом, но не обязательно. Таким образом, они вряд ли хорошие записи, чтобы начать объяснение.
Еще один важный момент: (физическое) "время" не имеет ничего общего со свойствами, обсуждаемыми здесь. Время - это просто способ осуществления измерения, чтобы показать значимость свойств, но далеко не суть. Подумайте дважды о роли "времени" в сложности времени - которая более или менее похожа, даже измерение часто в этом случае более значимо.
Параллельное программирование относится к операциям, которые кажутся перекрывающимися, и в первую очередь касается сложности, возникающей из-за недетерминированного потока управления. Количественные затраты, связанные с параллельными программами, как правило, являются как пропускной способностью, так и задержкой. Параллельные программы часто связаны с вводом-выводом, но не всегда, например, параллельные сборщики мусора полностью на CPU. Педагогическим примером параллельной программы является веб-сканер. Эта программа инициирует запросы на веб-страницы и принимает ответы одновременно, когда результаты загрузок становятся доступными, накапливая набор страниц, которые уже были посещены. Поток управления является недетерминированным, поскольку ответы не обязательно принимаются в одном и том же порядке при каждом запуске программы. Эта характеристика может сильно затруднить отладку параллельных программ. Некоторые приложения принципиально параллельны, например, веб-серверы должны обрабатывать клиентские соединения одновременно. Erlang, пожалуй, самый многообещающий новый язык для высококонкурентного программирования.
Параллельное программирование касается операций, которые перекрываются для конкретной цели повышения пропускной способности. Сложности параллельного программирования можно избежать, сделав поток управления детерминированным. Как правило, программы порождают наборы дочерних задач, которые выполняются параллельно, а родительская задача продолжается только после завершения каждой подзадачи. Это значительно облегчает отладку параллельных программ. Сложной частью параллельного программирования является оптимизация производительности в отношении таких проблем, как гранулярность и коммуникация. Последнее по-прежнему является проблемой в контексте многоядерных систем, поскольку перенос данных из одного кэша в другой сопряжен со значительными затратами. Плотное матрично-матричное умножение является педагогическим примером параллельного программирования, и его можно эффективно решить с помощью алгоритма "разделяй и властвуй" Стразена и параллельно атакуя подзадачи. Cilk, пожалуй, самый перспективный язык для высокопроизводительного параллельного программирования на компьютерах с общей памятью (включая многоядерные).
Скопировано из моего ответа: /questions/28373687/v-chem-raznitsa-mezhdu-parallelnyim-programmirovaniem-i-parallelnyim-programmirovaniem/28373694#28373694