Різниця між "паралельним" та "паралельним" виконанням?


107

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

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

Крім того, якщо ми розглядаємо щось на кшталт асинхронного вводу / виводу, чи маємо ми справу з одночасністю чи паралелізмом?


27
Коротше кажучи - одночасно: багато різних операцій відбувається відразу. паралельно: та сама операція, розбита на невеликі шматочки, що відбувається одразу.
Одід

3
@ Додано, я розумію, що означають ці слова, але у мене виникають проблеми з вирішенням наслідків. У вас є конкретний приклад?
blz

7
@ Додано, я не дуже з вами погоджуюся, ніде в їхніх визначеннях (загальних або застосованих до програмування) поняття "паралельний" і "паралельний" нічого не згадують про кількість або "розмір" операцій.
Shivan Dragon

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

2
@Oded: Так, але це, здається, є коренем непорозуміння між вами та ShivanDragon.
Авнер Шахар-Каштан

Відповіді:


97

Паралельність і паралелізм - це два споріднених, але відмінних поняття.

Паралельність означає, по суті, що завдання A і завдання B повинні відбуватися незалежно один від одного, і A починає працювати, і тоді B починається до того, як A буде закінчено.

Існують різні способи досягнення одночасності. Один з них - паралелізм - наявність декількох процесорів, які працюють над різними завданнями одночасно. Але це не єдиний спосіб. Інша - шляхом перемикання задач, яка працює так: Завдання A працює до певного моменту, тоді працюючий над цим процесор зупиняється і переходить до завдання B, працює над ним деякий час, а потім переходить до завдання A. Якщо тимчасові відрізки досить малі, користувачеві може здатися, що обидві речі виконуються паралельно, хоча вони насправді обробляють послідовно багатозадачним процесором.


4
Випадок B - як працює асинхронний IO, ні?
blz

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

1
Найкраще пояснення подають
Конрад

@MasonWheeler: Якщо у нас є лише 1 процесор, ми можемо мати лише паралельність, а не паралелізм. Правильно? Паралелізм може бути досягнутий більш ніж 1 процесором. Правильно? І якщо це правильно, і якщо ми маємо лише 1 процесор, то потоки з Java 8 не приносять користі.
Аніш Міттал

1
Прямо про перші кілька пунктів. Щодо останнього, чи є паралелізм єдиною вигодою, яку ви отримуєте від Потіків? Я не розробник Java, але моє враження, що Java Streams приблизно еквівалентні 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 обчислення послідовно упорядковуються за допомогою однієї черги.
damluar

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: "визначте: паралельність" .

Словник визначає "сумісність" як факт виникнення, тоді як визначення в обчислювальній мові є прихованою властивістю програми, властивості або системи. Хоча пов’язані ці речі не однакові.


Особисті рекомендації

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

Тому я б описав моделювання реактивного двигуна на декількох ядрах як паралельне.

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


6

Одночасне виконання - це узагальнена форма паралельного виконання. Наприклад, паралельну програму можна також назвати одночасною, але зворотне не відповідає дійсності.

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

Детальніше читайте в цьому дослідницькому документі Концепції одночасного програмування


1
"Паралельне виконання не можливе на одному процесорі, але на декількох процесорах" - крім, звичайно, там, де в процесорі є паралельні шляхи виконання, наприклад системи, що використовують паралелізм рівня інструкцій (він же "суперскалярні" архітектури, наприклад процесори Intel, оскільки Pentium, ARM Cortex та більшість інших процесорів високого класу) та Єдина множинна інформація з інструкцією, також відомі як архітектури паралельних даних (наприклад, MMX / SSE / тощо). Не кажучи вже про екзотичні домовленості, такі як процесори передачі даних тощо.
Жуль

3

Паралельна обробка - це підмножина паралельної обробки.

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

Паралельна обробка - це тип одночасної обробки, коли одночасно виконується більше одного набору інструкцій. Це може бути декілька систем, що працюють над загальною проблемою, як у розподілених обчисленнях, або декілька ядер в одній системі.


0

Заява tdammer наближається, решта - все, крім суті. Він каже:

"Сміливо кажучи, паралельність описує проблему (дві речі повинні відбуватися разом), а паралелізм описує рішення (два процесорні ядра використовуються для виконання двох речей одночасно"

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

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

Паралельно означає в тому ж напрямку, не перетинаючи, не перебуваючи в іншому шляху.

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


"Поточні засоби, що відбуваються зараз, актуальні, актуальні в даний момент. Con означає проти, протиставити, не узгоджувати". - необхідне цитування. Я сильно сумніваюся в обох цих твердженнях. Хоча "поточний" може мати значення, згадане тут англійською мовою, це не значення, яке вживається у слові "одночасне"
Халк

1
Я думаю, що переклад одночасного з латинської мови - це "бігти разом". Префікс 'con' часто означає разом , як у змові (дихати разом) наслідком (результати разом або слідом) зробити висновок (близько один до одного) і т. Д. Це дратує грань мови, що щось може мати протилежні значення, санкція - мій улюблений приклад .

@no comprende У цьому випадку (спільний струм) значення збігається разом, здається, краще підходить. Оскільки немає поточного ... У голландській мові concurrent є іменником, що означає конкурента. Курант звичайний, рухається навколо вас. Це також газета. Щось, що зараз активне. "Куранти для перерахування" - це поточний рахунок. Я відчуваю, що паралельність передбачає кон (!) Флікт. Бійка за один і той же ресурс. Біг в одному просторі. Можливо через голландське значення (конкурент).
Мартін Маат

Що б сказав Dijkstra, мені цікаво?

-1

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

Моє розуміння таке:

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

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

Зазвичай робочий кінь паралельних обчислень не знає про паралелізм і не піклується про нього. Хоча паралельні завдання часто явно використовують міжпроцесові або міжпотокові комунікації - такі як блокування черг, механізми синхронізації та блокування.


-1

На мою думку, з точки зору програмування програми немає різниці між цими двома поняттями, а наявність двох слів заплутано заради плутанини. Я думаю, що переплетення потоків було створене для імітації багатоядерної обробки ще в часи, коли багатоядерність не була можливою. Чому у нас є слово для цього застарілого мислення?

Мейсон Вілер та Пінгвін дали однакову відповідь. Одне Ядро з переключенням завдань і / або багатоядерним є одночасним, строго багатоядерним = паралельним.

Моя думка, що ці два терміни повинні бути об'єднані в один, і я докладаю зусиль, щоб не говорити "одночасно". Я думаю, що на рівні програмування ОС розрізнення є важливим, але з точки зору програміста це не має великого значення. Я написав mapReduce, Spark, MPI, cuda, openCL і багатопотокове с ++, і мені ніколи не довелося зупинятися і думати, чи робота працює з переплетеними нитками або з декількома ядрами.

Наприклад, коли я пишу багатопотокове с ++, іноді я не впевнений, скільки ядер я отримаю, хоча існують способи вимагати, скільки ядер ви отримаєте, як описано тут https://stackoverflow.com/questions/2166425/ як-структура-AC-додаток-до-використання-а-багатоядерний процесор . Іскро я просто малюю і зменшую операції, і не маю уявлення, як jvm обробляє їх на апаратному рівні. На GPU я думаюкожен потік призначений власному простому процесору, але я завжди синхронізую свої потоки там, де може виникнути проблема. З MPI зв'язок між машинами визначається чітко, але ми могли б переплутати функції, що працюють на декількох машинах на одному ядрі, та об'єднати результати за допомогою відповідної функції з однопотоковою різьбою. А що, якщо ми використовуємо MPI для узгодження групи одноядерних машин, кожна з яких має багатопотоковість? Яка різниця? Я б сказав, що ні. Назвіть це все "паралельно" і будьте з ним.


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