This commit is contained in:
2026-01-15 11:26:45 +02:00
commit 79e779148e
109 changed files with 19578 additions and 0 deletions
+1
View File
@@ -0,0 +1 @@
../doc-pz.yaml
File diff suppressed because it is too large Load Diff
+117
View File
@@ -0,0 +1,117 @@
#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$ процесорах використано
одновимірну декомпозицію даних по рядках.
Оптимальною топологією було визначено гіперкуб,
оскільки алгоритм потребує постійної
розсилки даних ("один-до-всіх") на кожній ітерації.