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

42. Навести приклад найпростішої програми на мові с з використанням технології mpi, яка виводить прізвище студента

#include “mpi.h”

main (int argc, char ** argv)

{ int rank, size;

MPI_Status status;

MPI_Init (&argc, argv);

MPI_Comm_size (MPI_COMM_WORLD, & size);

MPI_Comm_rank(MPI_COMM_WORLD, & rank);

Printf (“……………….. in roces №%d,” rank);

MPI_Finalize ();

}

43 Описати процес компіляції і виконання програми засобами середовища OpenMpi та компілятора gcc.

Демон- программа, яка запускається на кожній машині, для звязку. Щоб запустити паралельну програму на МРІ : запускають демони;

Mpiexec [ключі]–n_програма

Для компіляції програми потрібно ввести команду:

mpicc program.c –o program –для С

mpiхх program.c –o program –для С++

При умові успішної компіляції, запустити програму командою:

mpirun –np X program

де X – кількість процесів вказана у завданні.

Запуск демонов

mpdbootn число_демонов [ключи]

Запуск параллельной программы

mpiexec [ключи] –n число имя_исполняемого файла

Завершение работы всех демонов

Mpdallexit

44-маряна

45-маряна

46-маряна

47-маряна

48-маряна

49-маряна

50. OpenMP – це стандарт для реалізації бібліотек, призначених для написання додатків, що працюють на загальному полі пам'яті (SMP, NUMA). Даний стандарт передбачає реалізацію розпаралелювання шляхом використовування POSIX-threads. На відміну від останнього, OpenMP передбачає інтерфейс як до С-, так і до FORTRAN-програм. Існують відкриті реалізації стандарту, наприклад, OdinMP. Стандарт багатопотокового програмування! Орієнтується на SMP.

Переваги ОМР :

  1. Технологія є ефективнішою при створенні програми з великими паралельними циклами. Розробнику не потрібно створ. нову паралельну програму, а варто лише додати в текст послідовної програми ОpenMP директиви.

  2. Зручний спосіб контролю виконання паралельної програми

  3. ОpenMP програма на одноядерній платформі може виконуватися як послідовна.

Директиви просто ігноруються на етапі компіляції, аое при потребі можу бути перекомпілюована в паралельну.

  1. Підтримка orphan(відірвані директиви), тобто директиви синхронізації і розподілу роботи можуть не входити бузпосередньо в лексичний контекст паралельної області програми.

Gcc, ! gomp- бібліотека

Gcc –fopenmp hello.c –o hello

51Директива 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(оператор:список) – задає оператора і список загальних змінних;

52----

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

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

54.----

55. Навести конструкції технології 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. Кількість ниток, що виконують цю паралельну область, залишається незмінним до моменту виходу з області. При виході з паралельної області виробляється неявна синхронізація та видаляються всі нитки, крім породженої. 56. Навести конструкції технології 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) –іменована критична секція