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
@@ -0,0 +1,70 @@
#import "@local/nure:0.1.0": *
#show: pz-lb.with(
..yaml("doc.yaml"),
worknumber: 2,
title: "Pішення найпростіших математичних завдань за допомогою алгоритмів паралельних обчислень",
)
#v(-spacing)
== Мета роботи
#v(-spacing)
Метою роботи є оволодіння основними навичками аналізу трудомісткості
паралельних обчислень на прикладі паралельного алгоритму множення матриць,
визначення основних характеристик трудомісткості та їх залежності від схеми
обчислень та кількості процесорів. Отримання досвіду оцінки трудомісткості
паралельних обчислень за допомогою основних теорем.
== Хід роботи
#v(-spacing)
Темою на розгляд у даній роботі є множення матриць.
Елементи результуючої матриці розраховуютсья за наступною формулою: $c_(i j) = sum_(k=1)^n a_(i k)*b(k j)$
Візьмемо дві матриці розмірністю $n times n$.
Для розрахунку одного елементу результуючої матриці знадобиться $n + (n - 1) = 2n - 1$ операцій ($n$ множень, $n-1$ додавань).
Враховуючи $n^2$ елементів у вихідних матрицях, для розрахунку результату на одному процесорі (враховуючи, що одна операція займає одну одиницю часу)
знадобиться рівно $(2n - 1) * n^2$ одиниць часу. Іншими словами, час розрахунку на одному процесорі можна описати так:
$ T_1 = (2n - 1) * n^2 $
// NOTE: завдання 2
Спершу, розрахуємо всі основні показники для $p = n^2$. Враховуючи, що кількість процесорів дорівнює кількості елементів,
можемо зазначити, що час на виконання у багатопоточному режимі буде дорівнювати часу обробки одного елемента $T_p = 2n - 1$.
$ S_p = T_1/T_(n^2) = ((2n-1) dot n^2)/(2n-1) = n^2 $
$ E_p = S_p/p = n^2/n^2 = 1 $
$ C_p = T_p dot p = (2n-1) dot n^2 $
Відмітимо, що ефективність $E_p$ дорівнює одиниці, що означає 100% використання всіх процесорів під час роботи алгоритму.
Також, ціна дорівнює часу виконання на одному процесорі, що дає нам привід назвати цей розподіл роботи вартісно-оптимальним. // NOTE: E_p = S_p/p = T_1/C_p
// NOTE: завдання 3
Наступним кроком, визначимо кількість процесорів і розподіл робіт, що забезпечує підвищення прискорення $S_p$ відносно попереднього варіанту.
// S_p = T_1 / T_p
Враховуючи, що ми не можемо впливати на кількість обробки елементів одним процесором,
ми зменшимо кількість обробки $p$ процесорами, взявши $p = n^3$.
Ця міра дозволить нам зменшити час обробки всіх елементів до наступного:
$ T_p = T_"mult" + T_"sum" = 1 + log_2 n $
Де $T_"mult" = 1$ тому що ми розділили час множення елементів $n$ на кількість процесорів $n$, та $T_"sum" = log_2 n$, використовуючи каскадний алгоритм додавання, згідно з теор. 1 та 2.
Розрахуємо основні показники для даного розподілу.
$ S_p = T_1/T_(n^3) = ((2n-1) dot n^2)/(1+log_2 n) $
$ E_p = S_p/p = ((2n-1) dot n^2)/(1+log_2 n)/n^3 = (2n-1)/(n(1+log_2 n)) = (2n-1)/(n+log_2 n^n) $
$ C_p = T_p dot p = (1+log_2 n) dot n^3 $
// NOTE: завдання 4
Далі, визначимо розподіл робіт, при якому кількість процесорів може бути меншою, ніж в попередній задачі.
Для цього, візьмемо $p=n$. Використовуючи логіку з попередніх задач, визначимо паралельний час виконання: $T_p = n dot (2n - 1)$
Розрахуємо основні показники для даного розподілу.
$ S_p = T_1/T_(n) = ((2n-1) dot n^2)/(n dot (2n-1)) = n $
$ E_p = S_p/p = n/n = 1 $
$ C_p = T_p dot p = ((2n-1) dot n) dot n = (2n - 1) dot n^2 $
Можемо побачити абсолютно ідентичну ситуацію з усіма показниками (окрім прискорення)
з розподілом робіт, де $p=n^2$. Це означає, що цей алгоритм використовує процесори 100% часу
роботи алгоритма, а також є вартісно-оптимальним.
== Висновки
Було проведено аналіз розпаралелювання алгоритму добутку двох матриць, розмірністю $n times n$. Було застосовано декілька конфігурацій з різною кількістю процесорів.
Для кожної конфігурації було розраховано основні параметри.
Було отримано досвід оцінки трудомісткості
паралельних обчислень за допомогою основних теорем.