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


346

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

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


Ответы:


310

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

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

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

Резьбы на резьбовом станке:

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

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


34
Параллельное выполнение и параллельное программирование - это не одно и то же. Ответ от Джона Харропа правильный. Но, похоже, сам вопрос смешивает параллельное выполнение и параллельное программирование.
Blaisorblade

3
Возможность параллельного выполнения потоков зависит не только от машины. Например, OCaml (и Python?) Выполняет потоки одновременно, но не параллельно из-за глобальной блокировки для сборщика мусора.
Джон Харроп

1
Согласно этому блогу, параллельное программирование не является подмножеством параллельного программирования ; ваш ответ не принимает это во внимание, что вы думаете об этом утверждении?
Кевин

1
@ Кевин: Я думаю, что «более общий» означает суперсет. Я согласен, что это неправильно.
Джон Харроп

1
Этот ответ хорош для визуализации различий между параллельным и параллельным выполнением, но не для первоначального вопроса автора о программировании .
Reorx

396

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

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


18
«Сложная часть параллельного программирования ... такая как детализация и коммуникация». Если параллельные задачи должны взаимодействовать, разве это не делает их параллельными?
Джастин М. Кейс

13
«Если параллельные задачи должны взаимодействовать, разве это не делает их параллельными?» Вау, отличный вопрос! Не обязательно, нет. Суперкомпьютеры часто программируются массовыми параллельными операциями, за которыми следует глобальное перераспределение данных и более массовый параллелизм. Таким образом, существует параллелизм и коммуникация, но нет реального совпадения, о котором можно было бы говорить. В этом контексте я больше думал о многоядерном параллелизме, где коммуникация означает сложность кэша, например, коммуникация, необходимая для когерентности кэша. Хотя это одновременно, это также не видно напрямую.
Джон Харроп

43
@ BoppityBop Только то, что я могу сказать на рисунке то, что он сказал в романе, не делает мой ответ менее правильным. Просто легче читать тем, кто на самом деле не знает ответа. Который, я думаю, и есть смысл приехать сюда. Вы можете написать книгу на языке, используемом в этом посте, но для большинства читателей это будет абсолютно абсурдным, поскольку вы, вероятно, не задавали этот вопрос, если уже знаете половину того, что написал Джон.
Тор Валамо,

19
Картинка была очень полезной для меня, для кого-то, довольно новичка в этой теме, и описание от @JonHarrop было для меня полезным, для кого-то, кто ценит правильный, даже технический язык. Оба ответа способствовали моему более полному пониманию. Мы все победим! (хотя я ценю различие между параллельным выполнением и параллельным программированием)
Саммарон

3
«Erlang, пожалуй, самый многообещающий новый язык ...». Интересный выбор слов, так как Erlang ~ 30 лет и был открыт с открытым исходным кодом в 1998 году.
steinar

151

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

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

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


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

Для одновременного кода требуется два или более процессора (или «кофемашины»). Таким образом, этот ответ по существу неверен.
Джеффри Андерсон

6
@ GeoffreyAnderson Нет, это не так. Например, потоки и процессы выполняются одновременно на одноядерном компьютере.
Джон Харроп

@FrankHB - Пожалуйста, посмотрите на stackoverflow.com/a/57223044/1406510 и посмотрите на ссылку на источник - на сайте Oracle - так что это не может быть неправильно, но наше понимание может быть. Так что время переосмыслить. После прочтения я изменил свое мнение.
Нанософт

@ GeoffreyAnderson - Пожалуйста, посмотрите на stackoverflow.com/a/57223044/1406510. Он содержит ссылку от оракула и четко указывает, что к чему. Так что надо присоединиться к этому.
Нанософт

40

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

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

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

Изображения из статьи: «Параллельная и параллельная в Node.js»

приостановить и по очереди против параллельные вычисления



21

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

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


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

14

Я нашел это содержание в каком-то блоге. Мысль это полезно и актуально.

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

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

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

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


9

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

Источник: PThreads Programming - стандарт POSIX для лучшей многопроцессорной обработки, Бутлар, Фаррелл, Николс


5

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

И

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

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

Чтобы понять разницу, я настоятельно рекомендую посмотреть видео Роба Пайка (одного из создателей Голанга). Параллелизм - это не параллелизм


Ссылка vimeo здесь не работает, это ссылка на youtube youtube.com/watch?v=cN_DpYBzKso
Shivprasad Koirala

5

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

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


5

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

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

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

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

    Старайтесь избегать этого, иначе к чаю у нас будут слезы.

  • Одновременно : нам все равно. Мы не небрежны, хотя: мы проанализировали это, и это не имеет значения; поэтому мы можем выполнить любую задачу, используя любое доступное средство в любое время. Счастливые дни.

Часто доступное расписание изменяется при известных событиях, которые мы называем изменением состояния.

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

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

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

Удачи.


8
Я вижу заглавные буквы везде
Bruno Penteado

10
Этот ответ сложнее, чем темы параллелизма и параллелизма вместе.
Кай Селгрен

3

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

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

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


3

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

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

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

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


2

Источник параллелизма и параллелизма

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

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

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

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


1
Этот источник показывает только частный случай реализации - специализированную форму многопоточности. Да, он даже не охватывает всю историю многопоточности, например, модель потоков в пользовательском пространстве M: N и роль планирования потоков. Потоки - это только специализированный способ реализации в смысле архитектуры системы (ОС, ВМ, ЦП с поддержкой HT и т. Д.) И / или интерфейса программирования. Существует больше, например, параллелизм на уровне команд в реализации современного процессора, который не имеет интерфейса программирования и не имеет ничего общего с потоками.
FrankHB

@FrankHB: Я был бы признателен, если бы вы могли поделиться любыми подлинными ссылками на ваш контент. Я действительно хотел бы исследовать, есть ли еще что-то к этому. Мое текущее понимание довольно простое: запуск многопоточного приложения на любой архитектуре ОС с заданным механизмом планирования потоков - параллельное или параллельное - вопрос? Даже если вы дали пространство пользователя M: N - Как вы понимаете, является ли RUN параллельным или параллельным?
нанософт

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

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

1

Я попытаюсь объяснить это в своем собственном стиле, это может быть не в компьютерных терминах, но дает общее представление.

Давайте возьмем пример, скажем, работа по дому: уборка посуды, вывоз мусора, стрижка газона и т. Д., Также у нас есть 3 человека (темы) A, B, C, чтобы сделать их

Одновременно: три человека начинают разные задачи независимо друг от друга, т.е.

A --> cleaning dishes
B --> taking out trash 
C --> mowing the lawn 

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

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

мытье посуды:

A --> soaping the dishes
B --> washing the dishes

скоро

Надеюсь, что это дает представление! Теперь перейдем к техническим терминам, которые объясняются в других ответах;)


0

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

Основная абстракция делается в информатике, где как параллелизм, так и параллелизм относятся к свойствам программ. . Здесь программы представляют собой формализованные описания вычислений. Такие программы не должны быть на каком-либо конкретном языке или кодировке, которая зависит от реализации. Существование API / ABI / ISA / OS не имеет отношения к такому уровню абстракции. Конечно, для выполнения конкретных работ по программированию потребуются более подробные знания, специфичные для реализации (например, модель потоков), а дух базовой абстракции не меняется.

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

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

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

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

Хотя примитивы абстрагируют комплекс в абстракциях самого высокого уровня, реализации все еще имеют дополнительную сложность, не раскрытую языковой функцией. Итак, нужны абстракции среднего уровня. Типичным примером является многопоточность . Потоки позволяют выполнять один или несколько потоков (или просто поток ; иногда его также называют процессом , который не обязательно является концепцией задачи, запланированной в ОС), поддерживаемой реализацией языка (среда выполнения). Потоки обычно предварительно планируются во время выполнения, поэтому поток не должен ничего знать о других потоках. Таким образом, потоки естественны для реализации параллелизма, если они ничего не разделяют ( критические ресурсы): просто декомпозировать вычисления в разных потоках, как только базовая реализация позволяет перекрывать вычислительные ресурсы во время выполнения, это работает. Потоки также подвержены одновременному доступу к общим ресурсам: простой доступ к ресурсам в любом порядке соответствует минимальным ограничениям, требуемым алгоритмом, и реализация в конечном итоге определит, когда осуществлять доступ. В таких случаях могут потребоваться некоторые операции синхронизации. Некоторые языки рассматривают операции с потоками и синхронизацией как части высокоуровневой абстракции и представляют их как примитивы, в то время как некоторые другие языки вместо этого поощряют только относительно более высокоуровневые примитивы (такие как futures / promises ).

На уровне специфичных для языка потоков происходит многозадачность базовой хостинговой среды (обычно ОС). Упреждающая многозадачность на уровне ОС используется для реализации (вытесняющей) многопоточности. В некоторых средах, таких как Windows NT, основные единицы планирования (задачи) также являются «потоками». Чтобы отличить их от реализации упомянутых выше потоков в пользовательском пространстве, они называются потоками ядра, где «ядро» означает ядро ​​ОС (однако, строго говоря, это не совсем так для Windows NT; «настоящим» ядром является NT). исполнитель) . Потоки ядра не всегда сопоставляются с потоками в пространстве пользователя 1: 1, хотя сопоставление 1: 1 часто уменьшает большинство накладных расходов на сопоставление. Поскольку потоки ядра имеют большой вес (включая системные вызовы) для создания / уничтожения / связи,зеленые нитки в пользовательском пространстве для преодоления проблем с издержками за счет затрат на отображение. Выбор отображения в зависимости от парадигмы программирования, ожидаемой в абстракции высокого уровня. Например, когда ожидается одновременное выполнение огромного числа потоков пользовательского пространства (например, Erlang ), отображение 1: 1 никогда не выполнимо.

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

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


0

Просто поделюсь примером, который помогает подчеркнуть различие:

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.