Здавалка
Главная | Обратная связь

Директива omp critical в OpenMP програмах



Цей тип синхронізації використовується для опису структурних блоків, що виконуються тільки в одному потоці з усього набору паралельних потоків.

За допомогою директив #pragma omp critical [(<name>)] оформлюється критична секцiя програми. У кожний момент часу в критичнiй секцiї може перебувати не більше одного потоку. Якщо критична секцiя вже виконується будь-яким потоком, то всi інші потоки, якi виконали директиву для секцiї з даним name, будуть заблокован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люструє застосування директиви critical , змiнна n оголошена за межами паралельної областi, тому за замовчуванням є спiльною. Критична секція дозволяє розмежувати доступ до змiнної n. Кожен потiк по черзi присвоїть n свiй номер i потiм надрукує отримане значення.

int n ; #pragma omp parallel{

#pragma omp critical{

n=omp_get_thread_num( ) ;

printf ( "Потiк ␣%d\n" , n ) ;}}

 

Опції:

_ private(список) – задає список змiнних, для яких породжується локальна копiя в кожному потоцi; початкове значення локальних копiй змiнних зi списку не визначене;

_ firstprivate (список) – задає список змiнних, для яких породжується локальна копiя в кожному потоцi; локальнi копiї змiнних iнiцiалiзуются значеннями цих змiнних в основному потоцi;

_lastprivate (список) – змiнним, перерахованим у списку, присвоюється результат, отриманий в останнiй секцiї;

_ copyprivate(список) – пiсля виконання потоку, що мiстить конструкцiю single, новi значення змiнних списку будуть доступнi всiм однойменним приватним змiнним (private та firstprivate ), описаним на початку паралельної областi; опцiя не може використовуватися спiльно з опцiєю nowait; змiннi списку не повиннi бути перерахованi в опцiях private i firstprivate даної директиви single;

_reduction(оператор: список) – задає оператор i список спiльних змiнних; для кожної змiнної створюються локальнi копiї в кожному потоцi; локальнi копiї iнiцiалiзуются вiдповiдно до типу оператора (для адитивних операцiй – 0 або його аналоги, для мультиплiкативних операцiй – 1 або її аналоги); над локальними копiями змiнних пiсля виконання всiх операторiв паралельної областi виконується заданий оператор; оператори для мови Сi – +, 􀀀,_,&,|,^,&&,||,max,min; порядок виконання операторiв не визначений, тому результат може вiдрiзнятися вiд запуску до запуску.

_ nowait – пiсля виконання видiленої дiлянки вiдбувається неявна бар’єрна синхронiзацiя паралельно працюючих потокiв: їх подальше виконання вiдбувається тiльки тодi, коли всi вони досягнуть даної точки; якщо в подiбнiй затримцi немає необхiдностi, опцiя nowait дозволяє потокам, котрi вже дiйшли до кiнця дiлянки, продовжити виконання без синхронiзацiї з iншими.

_ordered – опцiя, що говорить про те, що в циклi можуть зустрiчатися директиви ordered; в цьому випадку визначається блок всерединi тiла циклу, який повинен виконуватися в тому порядку, в якому iтерацiї йдуть в послiдовному циклi;

 







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.