Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OpenMP_Pytannja.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
113.66 Кб
Скачать
  1. Директиви 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

  1. Паралельнi секцiї в OpenMp програмах

Директива sections використовується для завдання кiнцевого (неiтеративного) паралелiзму.

#pragma omp sections [опцiя [[,] опцiя ]...]

Ця директива визначає набiр незалежних секцiй коду, кожна з яких виконується власним потоком.

Опції: private, firstprivate , lastprivate , reduction, nowait

  1. Методи задання кількості потоків в 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.

  1. Управл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 при цьому не задається.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]