Різниця між паралельним і паралельним програмуванням?


44

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

А деякі мови програмування спеціально вимагають підтримки паралельного програмування, наприклад, Java .

Чи означає це, що паралельне та паралельне програмування насправді відрізняються?


10
Так, паралельне та паралельне програмування різні. наприклад, ви можете мати два потоки (або процеси), що виконуються одночасно на одному ядрі за допомогою переключення контексту. Коли два потоки (або процеси) виконуються на двох різних ядрах (або процесорах), у вас є паралелізм. Так, у першому випадку (паралельність) паралелізм є лише "віртуальним", тоді як у другому у вас справжній паралелізм. Тому кожна паралельна програма є одночасною, але зворотне не обов'язково відповідає дійсності.
Массімо Кафаро

1
Будьте обережні тут. Ви можете досягти того ж результату або через підтримку мови (тобто, розширення мови за допомогою нових конструкцій) або за допомогою підходу низького рівня (наприклад, за допомогою бібліотеки, як у випадку з MPI та OpenMP). У будь-якому разі, з поточними багатоядерними процесорами та операційними системами з підтримкою SMP, програма, яка буде одночасною, якщо працювати на старих одноядерних процесорах, може виконуватися паралельно, якщо ОС планує потоки виконання програми на різних ядрах. Отже, відмінність сьогодні трохи «розмита».
Массімо Кафаро

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


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

Відповіді:


26

Розрізняють паралелізм (використання додаткових обчислювальних одиниць для більшої роботи за одиницю часу) від одночасності (управління доступом до спільних ресурсів). Навчіть паралелізму спочатку, тому що це простіше і допомагає налагодити непослідовність мислення.

З «Софоморичне ∗ вступ до паралелізму спільної пам’яті та одночасності» Дена Гроссмана (версія від 16 листопада 2013 р.)


21

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

Цитуючи звідти:

У багатьох полях слова паралельні та одночасні є синонімами; не так у програмуванні, де вони використовуються для опису принципово різних понять.

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

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

Рекомендую ознайомитись з рештою у підручнику (с.4), але дозвольте мені навести частину решти цього розділу, оскільки він пов'язує парадигми програмування з кількісними та якісними характеристиками програм, такими як ефективність, модульність та детермінізм.

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

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

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

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

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


20

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

Паралельність

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

Це корисно в деяких аспектах:

  • Чітке програмування самостійних завдань в одній програмі.
  • Дозволяє працювати з IO під час обчислень (наприклад, в GUI).
  • Дозволяє одночасно виконувати більше однієї програми (паралельність на рівні ОС).

Деякі з основних проблем:

  • Підтримуйте узгодженість даних.
  • Уникайте тупиків і жир .
  • Визначте точну семантику паралельних процесів.
  • Визначте статичні властивості, що забезпечують правильність.

Паралелізм

Виконання двох завдань паралельно означає, що оператори виконуються одночасно . Це в основному корисно для:

  • Поліпшення пропускної здатності системи шляхом виконання програм паралельно (наприклад, для багатоядерних систем).
  • Покращити час виконання окремих програм за допомогою декількох процесорів одночасно.
  • Використовуйте IO на багатьох машинах (наприклад, розподілених базах даних).

Основні проблеми:

  • Проблеми з розділами, які дозволяють і розробляти алгоритми, які можуть використовувати паралелізм.
  • Мінімізуйте залежності та зв’язок між обчислювальними одиницями.
  • Усі проблеми, що приносяться одночасністю: принаймні з точки зору пам'яті, паралельні програми виглядають як паралельні через серіалізацію доступу до пам'яті.
  • Майте справу з неоптимальною апаратною підтримкою.

Дивіться також це питання для розмежування паралельних та розподілених обчислень.


4

Трохи ідеалізована відповідь, можливо ...

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

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


1

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

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

Наприклад, можна створити сто HTTP-запитів. У NodeJS найпростішим рішенням є відкриття всіх 100 запитів одразу методом зворотного виклику, а коли відповіді повертаються, метод виконується щоразу. Це паралельне програмування. У Ruby найпростішим (найпоширенішим) рішенням є відкриття запиту та обробка відповіді, відкриття наступного запиту та обробка відповіді тощо. Для багатьох запитів NodeJS простіше зробити своєчасно, хоча ви повинні бути обережно, щоб уникнути забивання сервера або максимізації вихідних з'єднань (це легко зробити помилково). Ви можете написати Ruby одночасно, але це не так, як написано більшість коду Ruby, і це боляче трохи це робити.

Паралельне програмуванняце код, який може запускатися одночасно в декількох потоках або процесах. Це дозволяє оптимізувати продуктивність за допомогою запуску коду в декількох процесорах (часто включаючи декілька машин, як це можливо з Akka). Оскільки NodeJS не є багатопотоковою і не має паралельного виконання, вам не доведеться турбуватися про написання коду потокової безпеки (і більшість кодів JavaScript, який я бачив, не є безпечним для потоків). У Java, навіть якщо мова не робить одночасне програмування звичайною схемою, паралельне програмування дуже вбудоване, і вам часто доводиться турбуватися про безпеку потоків. Якщо ви пишете Веб-сайт на Java, це зазвичай буде запускатися в контейнері, який виконує кожен запит в окремому потоці в одній пам'яті


Деякі з перерахованих вище залежать від сфери та меж, про які ви говорите. Я працюю на Веб-сайтах. Більшість кодів Java, які я бачу, не є одночасним програмуванням. Звичайно, якщо ви зменшите масштаб, зменшення порядку, на яке подає запит клієнта, не є важливим, але якщо ви збільшуєте масштаб далі, порядок виконання речей диктується кодом. Але код написаний так, що запити можуть виконуватися паралельно з великою кількістю спільних об'єктів, які повинні бути безпечними для потоків.

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

Для додаткового читання мені дуже подобаються ілюстрації у верхній відповіді на це запитання тут: https://www.quora.com/What-are-the-differences-bet between-parallel-concurrent-and-asynchronous-programming

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.