
- •1. Загальні вимоги
- •2. Завдання на курсове проектування
- •3. Вимоги до оформлення курсової роботи
- •4. Приклад виконання розділів курсового проекту
- •4.1 Опис методу рішення поставленої задачі та розробка алгоритму паралельної програми
- •4.2. Розробка та опис паралельної програми для реалізації поставленої задачі
- •4.3 Результати виконання програми
- •4.4. Висновки
- •Література Основна:
- •Додаткова:
4.2. Розробка та опис паралельної програми для реалізації поставленої задачі
Для реалізації розглянутого в п. 4.2 розв’язку системи лінійних алгебраїчних рівнянь методом Якобі необхідно розробити паралельну програму, яка може бути виконана засобами багатопроцесорної кластерної системи. Це може бути здійснено шляхом використання мови програмування С++ та пакету МРІ.
МРІ – це комплекс утиліт, та бібліотек, які призначені для організації обмінів пакетами даних між вузлами в системах з розподіленою пам’яттю. Утиліти пакету МРІ використовуються для встановлення зв’язку між вузлами, в бібліотеках містяться функції передавання даних.
В додатку 3 наведено лістинг паралельної програми для реалізації методу Якобі для розв’язку систем лінійних рівнянь. Програма може бути виконана засобами відповідно налаштованого кластера під керуванням операційної системи Windows XP, або Windows NT.
Програма складається з двох функцій: Distance() та main(). Функція Distance() викликається з функції main(), і має наступні вхідні параметри: масив x[], масив y[] і ціле число n. Функція обчислює і повертає середньоквадратичну оцінку наближеного значення розв’язку системи рівнянь на двох сусідніх ітераціях. Масивами x[] та y[] задаються два набори розв’язків, n – це кількість значень в цих масивах. Функція Distance() використовується для визначення моменту завершення обчислень, який наступає після досягнення потрібної точності.
В програмі використано наступні глобальні змінні: MAX_DIM – змінна, що задає максимально можливий розмір матриці А; MAX_PROC - змінна, що задає максимально можливу кількість процесів; tol - змінна, що задає потрібну точність.
Функція main() – це основні функція програми. Вона містить два аргументи argc і argv[], через які передаються дані із командного рядка при запуску програми. Ці змінні використовуються для ініціалізації паралельної програми з потрібною кількістю процесів за допомогою функції MPI_Init. Далі в програмі оголошуються потрібні змінні та вказівники на масиви елементів, відбувається ініціалізація паралельної програми та визначення загальної кількості процесів та номера поточного процесу за допомогою функцій MPI_Comm_size та MPI_Comm_rank.
Далі створюємо похідний тип даних за допомогою функцій MPI_Type_vector та MPI_Type_commit, який пізніше буде використано для розсилання даних процесам.
Якщо кількість процесів більша за розмірність матриці, то за допомогою функції MPI_Comm_create створюється комунікатор comm, який містить кількість процесів, що відповідає розмірності матриці. При цьому допоміжна функція MPI_Comm_group визначає групу процесів, що зв’язана з комунікатором MPI_COMM_WORLD, а функція MPI_Group_excl створює нову групу процесів gr2, номери яких не співпадають із номерами в масиві ranks. Інакше використовуються всі процеси і надалі буде використовуватись комунікатор comm, значення якого присвоюється береться MPI_COMM_WORLD.
Далі створюються масиви для елементів матриці А, вектора b та розв’язку ситеми Х.
Після цього в нульовому процесі обчислюються значення матриці А і вектора b з використанням генератора випадкових чисел. Далі в циклі визначається кількість елементів на кожен процес cnt, і зміщення елементів від початку масиву disp. Ці дані використовуються для розподіленого передавання матриці А та вектора b за допомогою функцій MPI_Scatterv. При передаванні використовується створений раніше тип даних TVector. Значення А розподіляється по процесах і записується в a_local, а вектор b – в b_local. Після розподілу даних робиться перша мітка часу за допомогою функції gettime().
Далі в програмі розпочинається цикл do-while, який виконується до перевищення максимально-допустимої кількості ітерацій max_iter і до досягнення необхідної точності tol. В зовнішньому циклі на кожній ітерації відбувається оновлення масивів x_old[i] значеннями x_new[i]. Далі організовано цикл, в якому в кожному процесі відбувається обчислення значень x_local, після чого виконується розподілений збір обчислених значень в усіх процесах за допомогою функції MPI_Allgather, результат записується в x_new.
Після завершення циклу виводиться інформація про досягнення потрібної точності та затрачений на обчислення час.