Директива 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 Все права принадлежат авторам размещенных материалов.
|