- •Паралельнi цикли в OpenMp програмах
- •Синхронізація в OpenMp програмах
- •Директива omp single в OpenMp програмах
- •Директива omp master в OpenMp програмах
- •Директиви barrier та flush в OpenMp програмах
- •Паралельнi секцiї в OpenMp програмах
- •Методи задання кількості потоків в OpenMp програмах
- •Управлiння розподiлом iтерацiй циклу мiж потоками
- •Директива ordered та nowait в OpenMp програмах(там де опції)
- •Виконання паралельної областi за умовою та задання кількості потоків
- •Змiннi оточення та допомiжнi функцiї в OpenMp програмах
- •Управлiння розподiлом iтерацiй циклу OpenMp програмах. (8 питання)
- •Директива omp master в OpenMp програмах
- •Директива omp critical в OpenMp програмах
- •Написати приклад паралельного множення
- •Написати приклад використання критичних
- •Написати приклад використання синхронiзацiї
- •Написати приклад паралельного додавання
- •Написати приклад паралельного
Директиви barrier та flush в OpenMp програмах
Директива flush. Оскiльки в сучасних паралельних обчислювальних системах може використовуватися складна структура та iєрархiя пам’ятi, користувач повинен мати гарантiї того, що в необхiдний йому моменти часу всi потоки будуть бачити єдиний узгоджений образ пам’ятi. Саме для цих цiлей i призначена директива:
#pragma omp flush [(список)]
Виконання даної директиви припускає, що значення всiх змiнних (або змiнних зi списку, якщо вiн заданий), тимчасово зберiгаються в регiстрах i кеш-пам’ятi поточного потоку, будуть занесенi в основну пам’ять; всi змiни змiнних, зробленi потоком пiд час роботи, стануть видимi iншим потокам; якщо якась iнформацiя зберiгається в буферах виведення, то буфери будуть скинутi i т.п. При цьому операцiя проводиться тiльки з даними потоку, що викликав директиву, данi, що змiнились iншими потоками, не зачiпаються. Оскiльки виконання даної директиви в повному обсязi може спричинити значнi накладнi витрати, а в даний момент потрiбна гарантiя узгодженого управлiння не всiх, а лише окремих змiнних, то цi змiннi можна явно перерахувати в директивi списком. До повного завершення операцiї нiякi дiї з перерахованими в нiй змiнними не можуть розпочатися.
Найпоширенiший спосiб синхронiзацiї в OpenMP – бар’єр. Вiн оформляється за допомогою директиви #pragma omp barrier. Потоки, виконують поточну паралельну область, дiйшовши до цiєї директиви, зупиняються i чекають, поки всi потоки не дiйдуть до цiєї точки програми, пiсля чого розблокуються i продовжують працювати
далi. Крiм того, для розблокування необхiдно, щоб всi потоки що синхронiзуються завершили всi породженi ними завдання (task). #pragma omp barrier
Паралельнi секцiї в OpenMp програмах
Директива sections використовується для завдання кiнцевого (неiтеративного) паралелiзму.
#pragma omp sections [опцiя [[,] опцiя ]...]
Ця директива визначає набiр незалежних секцiй коду, кожна з яких виконується власним потоком.
Опції: private, firstprivate , lastprivate , reduction, nowait
Методи задання кількості потоків в OpenMp програмах
OMP_NUM_THREADS – задання кiлькiсть потокiв, що виконують паралельну область. З програми її можна змiнити за допомогою виклику функцiї omp_set_num_threads(). У деяких випадках система може динамiчно змiнювати кiлькiсть потокiв, використовуваних для виконання паралельної областi, наприклад, для оптимiзацiї використання ресурсiв системи. Це дозволено робити, якщо змiнна середовища OMP_DYNAMIC встановлена в true. Змiнну OMP_DYNAMIC можна встановити за допомогою функцiї omp_set_dynamic(), дiзнатися значення змiнної можна за допомогою функцiї omp_get_dynamic().
Функцiя int omp_get_max_threads() повертає максимально кiлькiсть потокiв допустиму для використання в наступнiй паралельнiй областi.
Управлiння розподiлом iтерацiй циклу мiж потоками
При рiзному обсязi обчислень в рiзних iтерацiях циклу бажано мати можливiсть керувати розподiлом iтерацiй циклу мiж потоками – в OpenMP це забезпечується за допомогою параметра schedule директиви for. Поле type опцiї schedule може приймати наступнi значення:
_ static – статичний спосiб розподiлу iтерацiй до початку виконання циклу. Якщо поле chunk не вказано, то iтерацiї дiляться порiвну мiж потоками. При заданому значеннi chunk iтерацiї циклу дiляться на блоки розмiру chunk i цi блоки розподiляються мiж потоками до початку виконання циклу.
_ dynamic – динамiчний спосiб розподiлу iтерацiй. До початку виконання циклу потокам видiляються блоки iтерацiй розмiру chunk (якщо поле chunk не вказано, то вважається chunk = 1). Подальше видiлення iтерацiй (також блоками розмiру chunk) здiйснюється в момент завершення потоками своїх ранiше призначених iтерацiй.
_ guided – динамiчний розподiл iтерацiй, при якому розмiр блоку зменшується з деякого початкового значення до величини chunk (за замовчуванням chunk = 1) пропорційно кiлькостi ще не розподiлених iтерацiй, подiленому на кiлькiсть потокiв, що виконують цикл. Розмiр початкового блоку залежить вiд реалiзацiї. У рядi випадкiв такий
розподiл дозволяє акуратнiше роздiлити роботу i збалансувати завантаження потокiв. Кiлькiсть iтерацiй в останньому блоцi може виявитися менше значення chunk.
_ auto – спосiб розподiлу iтерацiй вибирається компiлятором i/або системою виконання. Параметр chunk при цьому не задається.
_ runtime – спосiб розподiлу iтерацiй вибирається пiд час роботи програми за значенням змiнної середовища OMP_SCHEDULE. Параметр chunk при цьому не задається.
