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

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



Паралельнi цикли в OpenMP програмах

Як вже зазначалося ранiше, програмний код блоку директиви parallel за замовчуванням виконуюється усiма потоками. Даний спосiб може бути корисний, коли потрiбно виконати однi й тi ж дiї багаторазово. або коли один i той же програмний код може бути застосований для виконання обробки рiзних даних. Останнiй варiант досить широко використовується при розробцi паралельних алгоритмiв i програм i зазвичай іменується розпаралелюванням за даними. У рамках даного пiдходу в OpenMP поряд iз звичайним повторенням в потоках

одного i того ж програмного коду, як у директивi parallel , можна здiйснити подiл ітеративно. Така можливiсть є тим бiльш важливою, оскiльки в багатьох випадках саме в циклах виконується основна частина трудомiстких обчислень. Якщо в паралельнiй областi зустрiвся оператор циклу, то, вiдповiдно до загального правила, вiн буде виконаний усiма потоками поточної групи, тобто кожен потiк виконає всi iтерацiї даного циклу. Для розпаралелювання циклiв в OpenMP застосовується директива for: #pragma omp for [опцiя [[,] опцiя ]...]

Ця директива вiдноситься до блоку, що йде слiдом за даною директивою, котрий містить оператор for.

 

Синхронізація в OpenMP програмах

Механізм роботи синхронізації можна описати таким чином. При ініціалізації набору паралельних процесів в програмі встановлюється контрольна точка (аналогічна контрольній точці в відладчик), в якій програма очікує завершення всіх породжених паралельних процесів. Відзначимо, що поки всі паралельні процеси свою роботу не завершили, програма не може продовжити роботу за точкою синхронізації. А оскільки всі сучасні високопродуктивні процесори є процесорами конвеєрного типу, стає зрозумілою і висока трудомісткість процедури синхронізації. Поки не завершені всі паралельні процеси, програма не може розпочати підготовку завантаження конвеєрів процесорів. Ось це і веде до великих втрат при синхронізації процесів, аналогічних втрат при роботі умовних операторів у звичайній послідовній програмі.

Всього в OpenMP існує шість типів синхронізації: critical, atomic, barrier, master, ordered, flush.

 

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

Якщо в паралельнiй областi яку-небудь дiлянку коду потрiбно виконати лише один раз, то його потрiбно видiлити директивою single. #pragma omp single [опцiя [[,] опцiя ]...]

Можливi опцiї: private, firstprivate, copyprivate, nowait

#pragma omp p a r a l l e l {

p r i n t f ( "Повiдомлення ␣1\n" ) ;

#pragma omp s i n g l e nowait

{p r i n t f ( "Один␣ п о т i к \n" ) ;}

p r i n t f ( "Повiдомлення ␣2\n" ) ;}

 

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

Директиви master видiляють дiлянку коду, який буде виконаний тiльки основним потоком. Решта потокiв просто пропускають дану дiлянку i продовжують роботу з оператора, розташованого слiдом за ним. Неявної синхронiзацiї дана директива не передбачає.

#pragma omp parallel private(n)
{ n = 1; #pragma omp master
{ n = 2; }
printf("Перше значення n: %d\n", n); }

 







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