х командних потоків (threads). Далі ці потоки можуть виконуватися на різних процесорах обчислювальної системи. У результаті такого підходу програма представляється у вигляді набору послідовних (однопотокових) і паралельних (багатопотокових) ділянок програмного коду. Подібний принцип організації паралелізму отримав найменування вилочного (fork-join) або пульсуючого паралелізму.
Ідея технології OpenMP полягає в наступному. За основу береться послідовна програма, а для створення її паралельної версії надається набір директив. Стандарт OpenMP розроблений для мов Фортран, С і С ++. Весь текст програми розбивається на послідовні і паралельні області. У початковий момент часу породжується нитка-майстер або основна нитка, яка починає виконання програми зі стартовою точки. При вході в паралельну область породжуються додаткові нитки. Після породження кожна нитка отримує свій унікальний номер, причому нитка-майстер завжди має номер 0. Всі нитки виконують один і той же код, відповідний паралельної області. При виході з паралельної області основна нитка чекає завершення решти ниток, і подальше виконання програми продовжує тільки вона. У паралельній області всі змінні програми поділяються на два класи: загальні (SHARED) і локальні (PRIVATE). Загальна змінна завжди існує лише в одному екземплярі для всієї програми і доступна всім ниткам під одним і тим же ім'ям. Оголошення локальної змінної викликає породження свого примірника даної змінної для кожної нитки. Зміна ниткою значення своєї локальної змінної не впливає на зміну значення цієї ж локальної змінної в інших нитках.
Всі директиви OpenMP представлені в програмі у вигляді коментарів і починаються, згідно синтаксису Фортран, на один з трьох символів:!, C або *.
Для визначення паралельних областей програми використовується пара директив
! $ OMP PARALLEL
lt; паралельний код програми gt;
! $ OMP END PARALLEL
Для виконання коду, розташованого між даними директивами, додатково породжується OMP_NUM_THREADS () - 1 ниток. Процес, який виконав дану директиву (нитка-майстер), завжди отримує номер 0. Всі нитки виконують код, укладений між даними директивами. Після END PARALLEL автоматично відбувається неявна синхронізація всіх ниток, і як тільки всі нитки доходять до цієї точки, нитка-майстер продовжує виконання подальшої частини програми, а решта нитки знищуються.
Всі породжені нитки виконують один і той же код. Для розподілу роботи між ними часто використовується директива DO. Іншими словами якщо в послідовній програмі зустрівся оператор циклу DO то, використовуючи директиви
! $ OMP DO
lt; do цикл gt;
! $ OMP END DO
його можна распараллелить в паралельній частині програми.
. 2.4 Cравненіе можливостей OpenMP і TPL
Для порівняння можливостей слід розглянути і порівняти деякі інструменти паралелізму OpenMP і бібліотеки TPL. При постійному застосуванні однієї з технології та будь-якого інструменту важливо знати про особливості, які вони можуть надати. Для використання даних інструментів в паралельному програмуванні слід розглянути їх з точки зору наступних завдань:
· Обробка виключень;
· Планування обчислень;
· Управління циклом;
· Установка параметрів обчислень.
Першою розглянутої завданням є обробка виключень. Очевидно, що при роботі додатків часто виникають виняткові ситуації, пов'язані з будь-якими зовнішніми або внутрішніми помилками. Для підвищення безпеки і надійності коду та програми в цілому необхідно використовувати механізм, який дозволяє обробити виняткову ситуацію, а не обрушити роботу програми.
У TPL основні функції представлені класами Task і Parallel. Нагадаємо, що клас Task являє собою окрему асинхронну операцію - задачу, а клас Parallel - методи для ітеративного та функціонального розпаралелювання. При паралельному виконанні завдань, в будь-який з них може статися виняткова ситуація. У TPL при поява такої ситуації можлива коректна обробка.
Винятки в одному потоці не можуть безпосередньо вплинути на роботу інших потоків. При цьому винятки можуть з'являтися в двох і більше потоках одночасно. У TPL механізм обробки виключень представлений наступним чином: в момент появи помилки виникає виняток, який завершує потік і передається вгору по рівню. Така ж ситуація відбувається і в інших потоках. Після завершення всіх завдань у TPL всі винятки збираються в одне - AggregateException. Далі композитне виключення може бути оброблено після завершення паралельного блоку коду. У класу AggregateEx...