- •Паралельн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ї
- •Написати приклад паралельного додавання
- •Написати приклад паралельного
Паралельн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); }
