Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
піро2.doc
Скачиваний:
25
Добавлен:
05.03.2016
Размер:
989.7 Кб
Скачать

52Директива parallel

Паралельна область задається за допомогою директиви parallel (parallel

... end parallel).

Сі:

#pragma omp parallel [опція[[,] опція]...]

Можливі опції:

· if(умова) – виконання паралельної області по умові. Входження в паралельну область здійснюється тільки при виконанні

деякої умови. Якщо умова не виконана, то директива не спрацьовує і продовжується обробка програми в колишньому режимі;

· num_threads (цілочисельний вираз) – явне завдання кількості ниток, які виконуватимуть паралельну область; за умовчанням вибирається останнє значення, встановлене за допомогою функції omp_set_num_threads(), або значення змінної

OMP_NUM_THREADS;

default(private|firstprivate|shared|none) – всім змінним в

паралельній області, яким явно не призначений клас, буде призначений клас private, firstprivate або shared відповідно; none означає, що всім змінним в паралельній області клас повинен бути призначений явно; у мові Сі задаються тільки варіанти shared або none;

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

копій змінних із списку не визначено;

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

· shared(список) – задає список змінних, загальних для всіх ниток;

· copyin(список) – задає список змінних, оголошених як

threadprivate, які при вході в паралельну область ініціалізувалися значеннями відповідних змінних в нитці-майстрові;

· reduction(оператор:список) – задає оператора і список загальних змінних;

53Навести конструкції технології OpenMp на мові с для паралельного виконання циклу області технології OpenMp.

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

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

Розглянутий вище підхід є основою технології OpenMP, найбільш широко вживаною в даний час для організації паралельних обчислень на багатопроцесорних системах із загальною пам'яттю. У рамках даної технології директиви паралелізму використовуються для виділення у програмі паралельних областей (parallel regions), в яких послідовний виконуваний код може бути розділений на декілька роздільних командних потоків (threads). Далі ці потоки можуть виконуватися на різних процесорах обчислювальної системи. У результаті такого підходу програма представляється у вигляді набору послідовних (однопотокових) та паралельних (багатопотокових) ділянок програмного коду.

omp_lock_t dmax_lock;

omp_init_lock (dmax_lock);

do {

dmax = 0; // максимальна зміна значень u

#pragma omp parallel for shared(u,n,dmax) private(i,temp,d)

for ( i=1; i<N+1; i++ ) {

#pragma omp parallel for shared(u,n,dmax) private(j,temp,d)

for ( j=1; j<N+1; j++ ) {

temp = u[i][j];

u[i][j] = 0.25*(u[i-1][j]+u[i+1][j]+

u[i][j-1]+u[i][j+1]–h*h*f[i][j]);

d = fabs(temp-u[i][j]);

omp_set_lock(dmax_lock);

if ( dmax < d ) dmax = d;

omp_unset_lock(dmax_lock);

} // конец вложенной параллельной области

} // конец внешней параллельной области

} while ( dmax > eps );

54.num_threads (цілочисельне вираження) - явне задання кількості ниток, які виконуватимуть паралельну область; по замовчуванні вибирається останнє значення, встановлене за допомогою функції omp_set_num_threads(), або значення змінної OMP_NUM_THREADS;

За допомогою функцій omp_get_thread_num() і omp_get_num_threads() нитка може взнати свій номер і загальне число ниток, а потім виконувати свою частину роботи залежно від свого номера (цей підхід широко використовується в програмах на базі інтерфейсу MPI).

55.----

56. Навести конструкції технології OpenMP на мові С для керування паралельними секціями.

#pragma omp parallel sections

{#pragma omp section

f1();

…#pragma omp section

f2();}

sections використовується тоді коли необхідно блоки коду виконувати в окремих потоках.

sections оголошує цілу ділянку секцій, а кожна окрема секція за допомогою директиви section. Кожний section – це окремий потік.

При вході в паралельну область породжуються нові OMP_NUM_THREADS-1 ниток, кожна нитка отримує свій унікальний номер, причому що породжує нитка отримує номер 0 і стає основною ниткою групи ( «майстром»). Решта нитки отримують в якості номера цілі числа з 1 до OMP_NUM_THREADS-1. Кількість ниток, що виконують цю паралельну область, залишається незмінним до моменту виходу з області. При виході з паралельної області виробляється неявна синхронізація та видаляються всі нитки, крім породженої. 57. Навести конструкції технології OpenMP на мові С для керування роботою процесів у критичних секціях, бар'єрами.

Критичні секції є невід’ємним етапом виконання програми . При виявлені критичної секції потік призупиняється і очікує її звільнення зокрема це може трапитись при виконанні циклів а також може виникати задача коли всі потоки в певний момент часу планово мають з’явитися в певній секції це називається бар’єром в такому випадку всі потоки зупиняються до того часу поки всі інші не з’являються в даному бар’єрі. Він є методом синхронізації в OpenMP.

For (int i=0; i<5000; i++) {…}

#pragma omp fpr nowait

For (int j=0; j<1000; j++) {…}

#pragma mop barrier

Nowait – відключає синхронізацію

Barrier призупиняє виконання всіх потоків які вже звільнилися до моменту звільнення всіх інших.

#pragma omp for critical {…}

Critical вказує на те що поки в відповідному фрагменті є хоча б один потік інші ввійти в дану секцію не можуть. Це є неіменована критична секція.

Critical(same val) –іменована критична секція

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