МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ ТРАНСПОРТНИЙ УНІВЕРСИТЕТ
Кафедра інформаційних систем і технологій
Лабораторна робота № 1
з дисципліни «Технології розподілених систем та паралельних обчислень»
на тему: «Системи проектування паралельних програм»
Мета - дати уявлення про побудову простих паралельних програм на мові паралельного програмування MPI; уявлення про паралельних програмах, що настроюються на розмір обчислювальної системи, як на параметр; практичне освоєння функцій парних і колективних взаємодій між гілками паралельної програми.
Методи розпаралелювання та моделі програм, підтримувані MPI.
Найважливішою особливістю MPI є те, що користувач при написанні своїх паралельних програм не повинен враховувати архітектурні особливості конкретних мультикомп’ютерів, оскільки MPI надає користувачеві віртуальний мультикомп’ютер з розподіленою пам'яттю і з віртуальною мережею зв'язку між віртуальними комп'ютерами. Користувач замовляє кількість комп'ютерів, необхідних для вирішення його задачі, і визначає топологію зв'язків між цими комп'ютерами. MPI реалізує це замовлення на конкретній фізичній системі. Обмеженням є обсяг оперативної пам'яті фізичного мультикомп’ютера. Таким чином користувач працює у віртуальному середовищі, що забезпечує переносимість його паралельних програм. Система MPI являє собою бібліотеку засобів паралельного програмування для мов С та Fortran 77.
Однією з цілей, переслідуваних при вирішенні завдань на обчислювальних системах, в тому числі і на паралельних, - є ефективність. Ефективність паралельної програми істотно залежить від співвідношення часу обчислень до часу комунікацій між комп'ютерами (при обміні даними). І чим менше в процентному відношенні частка часу, витраченого на комунікації, в загальному часу обчислень, тим більше ефективність. Для паралельних систем з передачею повідомлень оптимальне співвідношення між обчисленнями і комунікаціями забезпечують методи грубозернистого розпаралелювання, коли паралельні алгоритми будуються з великих і рідко взаємодіючих блоків. Завдання лінійної алгебри, завдання, які вирішуються сітковими методами і багато інших, досить ефективно розпаралелювати грубозернистими методами.
Останню модель інакше можна назвати моделлю розпаралелювання за даними. Коротко, суть цього способу полягає в наступному. Вихідні дані завдання розподіляються по процесах (гілкам паралельного алгоритму), а алгоритм є одним і тим же у всіх процесах, але дії цього алгоритму розподіляються у відповідності з наявними в цих процесах даними. Розподіл дій алгоритму полягає, наприклад, у привласненні різних значень змінним одних і тих же циклів у різних гілках, або у виконанні в різних гілках різної кількості витків одних і тих же циклів і т.п. Іншими словами, процес у кожної гілки слід різними шляхами виконання на тій же самій програмі.
Скрізь далі замість "паралельна програма" будемо писати скорочено: п-програма.
ПРИКЛАД 1
Кожна гілка п-програми виводить на екран свій ідентифікаційний номер і розмір замовленої паралельної системи, тобто кількість віртуальних комп'ютерів, в кожен з яких завантажується гілку п-програми.
# include <stdio.h>
# include <mpi.h>
int main(int argc, char** argv)
{
int size, rank;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
printf("SIZE =% d RANK =% d \n", size, rank);
MPI_Finalize();
return (0);
}
ЗАВДАННЯ
Скомпілювати та запустити програму прикладу 1 на 4-х комп’ютерах.
ВИКОНАННЯ:
/
/
ПРИКЛАД 2
Гілка з номером 0 пересилає дані (в даному випадку число 10) гілки з номером 3. Гілку 3 друкує на екран свій номер і прийняте число від нульової гілки.
# include <stdio.h>
# include <mpi.h>
int main(int argc, char** argv)
{
int size, rank, a, b;
MPI_Status st;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
if (rank == 0)
{
a = 10;
MPI_Send(&a, 1, MPI_INT, 3, 15, MPI_COMM_WORLD);
}
else
{
if(rank == 3)
{
MPI_Recv(&b, 1, MPI_INT, 0, 15, MPI_COMM_WORLD, &st);
printf("Vetv =% d b =% d \n", rank, b);
}
}
MPI_Finalize();
return (0);
}
ЗАВДАННЯ
Скомпілювати і запустити програму прикладу 2 на 4-х комп'ютерах.
ВИКОНАННЯ:
/
/
ПРИКЛАД 3
Гілка з номером 0 пересилає дані (в даному випадку число 10) останньої гілки в безлічі запущених гілок. Остання гілка друкує на екран свій номер і прийняте число від нульової гілки.
# include <stdio.h>
# include <mpi.h>
int main(int argc, char** argv)
{
int size, rank, a, b;
MPI_Status st;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
if (rank == 0)
{
a = 10;
MPI_Send(&a, 1, MPI_INT, size - 1, 15, MPI_COMM_WORLD);
}
else
{
if(rank == size - 1)
{
MPI_Recv(&b, 1, MPI_INT, 0, 15, MPI_COMM_WORLD, &st);
printf("Vetv =% d b =% d \n", rank, b);
}
}
MPI_Finalize();
return (0);
}
ЗАВДАННЯ
Скомпілювати і запустити програму прикладу 3 на 4-х комп'ютерах.
ВИКОНАННЯ:
/
/