Паралелізм завдань
Паралелізм завдань (також відомий як паралелізм функції або керований паралелізм) є однією з форм розпаралелювання комп'ютерного коду між декількома процесорами в паралельних обчислювальних середовищах.
Паралелізм завдань акцентує увагу на розподілі процесів, орієнтованих на конкретну задачу або потоків на різних процесорах. Це контрастує з паралелізмом даних як інша форма паралелізму.
У багатопроцесорній системі, паралелізм завдань досягається, коли кожен процесор виконує іншу нитку (процес) для одних і тих же або різних даних. Нитки можуть виконувати один і той же або інший код. У загальному випадку, потоки які виконуються, взаємодіють один з одним, під час виконання. Зв'язок зазвичай відбувається шляхом передачі даних від одного потоку до іншого, як частина робочого процесу.
Часто розпаралелювання на цьому рівні є найпростішим і найефективнішим. Таке розпаралелювання можливе в тих випадках, коли розв'язуване завдання складається з незалежних підзавдань, кожне з яких можна виконати окремо. Хорошим прикладом може бути стиснення аудіоальбому. Кожен запис може оброблятися окремо, так як він ніяким «технічним» чином не зв'язаний з іншими.
Розпаралелювання на рівні завдань нам демонструє операційна система, запускаючи на багатоядерній машині програми на різних ядрах. Якщо перша програма показує нам фільм, а друга є файловим клієнтом, то операційна система спокійно зможе організувати їх паралельну роботу.
Як простий приклад, якщо ми запускаємо код на 2-процесорній системі (CPU «a» і «b») в паралельному середовищі, і хочемо виконати завдання «A» і «B» одночасно, можна сказати процесору «а» робити завдання «A» і процесору «b», щоб виконував завдання «B», тим самим скорочуючи час виконання. Завдання можуть бути призначені, за допомогою умовних операторів, як описано нижче.
Даний вид розпаралелювання простий, в деяких випадках досить ефективний. Але коли ми маємо справу з однорідним завданням, то даний вид розпаралелювання не можна застосувати. Операційна система ніяк не може прискорити програму, яка використовує тільки один процесор, скільки б ядер не було б доступно. Програма, що розбиває кодування звуку і зображення в відеофільмі на два завдання нічого не отримає від третього або четвертого ядра. Що б розпаралелити однорідні завдання, потрібно спуститися на рівень нижче, на рівень даних.
Паралелізм завдань підкреслює розподілений (паралельний) характер обробки (тобто потоки), на відміну від даних (паралелізм даних). Більшість реальних програм знаходяться десь на континуумі між паралелізмом задач і паралелізмом даних.
Паралелізм рівня ниток (ПРН) — це паралелізм, властивий програмам, які виконуються в кількох потоках одночасно. Цей тип паралелізму зустрічається в основному в програмах, написаних для комерційних серверів, таких як бази даних. Запустивши багато потоків одночасно, ці програми здатні переносити велику кількість операцій введення-виведення і час очікування системи пам'яті, які їх робочі навантаження можуть перейняти на себе, поки одна нитка затримана, чекаючи пам'яті або доступу до диску, інша нитка може виконувати корисну роботу.
Експлуатація рівня ниток паралелізму почала виходити на ринок настільних комп'ютерів з появою багатоядерних мікропроцесорів. Це сталося тому що, з різних причин, це стає все більш недоцільним збільшувати або тактову частоту або інструкції за такт одного ядра. Якщо ця тенденція збережеться, нові програми повинні бути розроблені, щоб використовувати кілька потоків для того, щоб отримати вигоду зі збільшенням потенційної обчислювальної потужності. Це контрастує з попередніми мікропроцесорними інноваціями, в якому існуючий код був автоматично прискорено, запустивши його на новішому / швидшому комп'ютері.
Псевдокод ілюструє паралелізм завдань:
program: ... if CPU="a" then do task "A" else if CPU="b" then do task "B" end if ... end program
Мета програми — дещо розставити мережі завдання («А+Б»). Якщо ми пишемо код, як описано вище, і запустимо його на системі з двома процесорами, то середовище виконуватиме його наступним чином.
- У SPMD системи, обидва CPU будуть виконувати код.
- У паралельному середовищі, обидва будуть мати доступ до тих же даних.
- Оператор «if» розмежовує роботу процесорів. CPU «а» буде зчитувати true в «if», а CPU «b» зчитувати true з «else if», таким чином, маючи свою власну задачу.
- Тепер обидва CPU виконують окремі блоки коду одночасно, виконуючи різні завдання одночасно.
Код, виконуваний CPU «а»:
program: ... do task "A" ... end program
Код, виконуваний CPU «b»:
program: ... do task "B" ... end program
Ця концепція може бути узагальнена на будь-яке число процесорів.
Приклади мов для паралельних завдань можуть бути знайдені в області мови опису апаратури таких як verilog або VHDL, які можуть також розглядатися як представлення «статичного коду» парадигми програмного забезпечення, де програма має статичну структуру, і дані змінюються щодо «статичних даних» моделі, де дані не змінюються (або змінюються повільно) і обробки (прикладні методи), зміна (наприклад, пошук по базі).
Паралелізм завдань може підтримуватися на основних мовах, вбудованих засобах або бібліотеках. Відомі приклади включають:
- C++ (Intel): Threading Building Blocks
- C, C++, Objective-C (Apple): Grand Central Dispatch
- D: tasks and fibers
- Go: goroutines
- Java: Java concurrency
- .NET: Task Parallel Library
- Quinn Michael J, Parallel Programming in C with MPI and OpenMP McGraw-Hill Inc. 2004. ISBN 0-07-058201-7
- Знайомство з рівнями розпаралелювання