Files
tvo/pz3/ТВО_КНТ_22_1_Орлов_ПЗ3.typ
T
2026-01-15 11:26:45 +02:00

118 lines
7.9 KiB
Typst
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#import "@local/nure:0.1.0": *
#show: pz-lb.with(..yaml("doc.yaml"), worknumber: 3, title: "Розв'язування систем лінійних рівнянь")
#v(-spacing)
== Мета роботи
#v(-spacing)
Реалізувати розв’язання системи лінійних алгебраїчних рівнянь методом
Гауса з імітацією паралельних обчислень та розрахувати показники ефективності.
== Хід роботи
#v(-spacing)
Запишемо вихідну систему. Ми використаємо алгоритм Гауса для знаходження її рівнянь.
Почнемо з прямого ходу.
$
mat(
1, 3, 2, 1;
2, 7, 5, 18;
1, 4, 6, 26;
augment: #(-1)
)
$
Маємо $a_11 = 1$, тож можемо не ділити перший рядок, а одразу віднімати його
(помножений на 2 та 1, відповідно) від другого та третього. У результаті
отримуємо:
$
mat(
1, 3, 2, 1;
0, 1, 1, 16;
0, 1, 4, 25;
augment: #(-1)
)
$
Помноживши його на 1, віднімаємо другий рядок від третього. Результат:
$
mat(
1, 3, 2, 1;
0, 1, 1, 16;
0, 0, 3, 9;
augment: #(-1)
)
$
Для зворотнього ходу застосуємо формулу $x_i = (b_i - sum_(j=i+1)^n a_(i j) dot x_j)/a_(i i)$
$ x_3 = 9 / 3 = 3 $
$ x_2 = (16 - 3) / 1 = 13 $
$ x_1 = (1 - (39 + 6)) / 1 = -44 $
Для розпаралелювання алгоритму використано схему стрічкового циклічного
розділення даних. Це дозволяє рівномірно
розподілити навантаження, оскільки кількість активних рядків зменшується з
кожною ітерацією.
Відповідно до методичних вказівок, для ефективної реалізації операцій розсилки
даних обрана топологія мережі "Гіперкуб".
Це зумовлено тим, що основною комунікаційною операцією є
передача ведучого рядка від одного процесора всім іншим, що в такій топології
виконується за логарифмічний час $O(log_2 p)$.
Прямий хід складається з $n-1$ ітерацій. Нехай $k$ номер поточної ітерації ($0 <= k < n-1$).
+ Вибір ведучого елемента: процесор, що містить рядок $k$, обирає головний елемент $a_(k k)$;
+ комунікація (Broadcast): процесор-власник розсилає рядок $k$ та елемент $b_k$ усім іншим процесорам. Трудомісткість цієї операції оцінюється як: $(n-1) log_2 p dot (alpha + w dot n / beta)$;
+ Обчислення: кожен процесор модифікує свої локальні рядки $i$ ($i > k$):
$ l_(i k) = a_(i k) / a_(k k) $
$ a_(i j) = a_(i j) - l_(i k) dot a_(k j) $
$ b_i = b_i - l_(i k) dot b_k $
Алгоритм розпаралелювання зворотнього ходу виконується від $i = n-1$ до $0$.
1. Обчислення кореня: Процесор-власник рядка $i$ знаходить $x_i$:
$ x_i = (b_i - sum_(j=i+1)^(n-1) a_(i j) dot x_j) / a_(i i) $
2. Комунікація: Знайдене значення $x_i$ розсилається всім процесорам.
Трудомісткість: $(n-1) log_2 p (alpha + w/beta)$.
3. Оновлення: Процесори підставляють відоме $x_i$ у свої рівняння для рядків $k < i$.
Оцінка ефективності базується на припущенні про використання топології
"Гіперкуб", що дозволяє виконувати операції розсилки даних
(Broadcast) та редукції за логарифмічний час $O(log_2 p)$.
1. послідовний алгоритм ($T_1$):
трудомісткість послідовного методу Гаусса складається з суми операцій прямого ходу ($approx 2/3 n^3$) та зворотного ходу ($approx n^2$, враховуючи лише ділення та множення). Згідно з методичними вказівками, загальна складність становить:
$ T_1 approx 2/3 n^3 + 2 n^2 $
2. паралельний алгоритм ($T_p$):
загальний час виконання складається з обчислювальної частини та комунікаційних витрат.
Обчислювальна складова: При використанні циклічного розподілу рядків навантаження балансується рівномірно, тому час обчислень зменшується пропорційно кількості процесорів:
$ T_("comp") approx 1/p dot (2/3 n^3) dot tau $
де $tau$ час виконання однієї базової арифметичної операції.
Комунікаційна складова ($T_("comm")$): Включає три основні етапи взаємодії на кожній ітерації (пошук ведучого елемента, розсилка рядка, зворотна підстановка). Для $n$ ітерацій на топології гіперкуба сумарні витрати оцінюються формулою:
$ T_("comm") approx (n-1) dot log_2 p dot (3 alpha + (w(n+2))/beta) $
де $alpha$ латентність мережі, $beta$ пропускна здатність каналу, $w$ розмір елемента даних у байтах.
Сумарна трудомісткість ($T_p$):
$ T_p = T_("comp") + T_("comm") approx (2 n^3)/(3 p) tau + n log_2 p (3 alpha + (w n)/beta) $
3. показники ефективності:
на основі наведених вище оцінок, теоретичне прискорення ($S_p$) та ефективність ($E_p$) розраховуються як:
$ S_p = T_1 / T_p = (2/3 n^3 + 2 n^2)/((2 n^3)/(3 p) tau + n log_2 p (3 alpha + (w n)/beta)) $
$ E_p = S_p / p = (2/3 n^3 + 2 n^2)/((2 n^3)/(3 p) tau + n log_2 p (3 alpha + (w n)/beta))/p $
При $n >> p$ (коли розмірність задачі значно перевищує кількість процесорів), вплив комунікаційної складової зменшується, і $E_p$ наближається до 1. Однак при фіксованому $n$ збільшення $p$ призводить до зростання частки $T_("comm")$ у загальному часі, що знижує ефективність.
== Висновки
Було реалізувано розв’язання системи лінійних алгебраїчних рівнянь методом
Гауса з імітацією паралельних обчислень та розрахувано показники ефективності.
Для розв'язання СЛАР методом Гаусса на $p$ процесорах використано
одновимірну декомпозицію даних по рядках.
Оптимальною топологією було визначено гіперкуб,
оскільки алгоритм потребує постійної
розсилки даних ("один-до-всіх") на кожній ітерації.