Professional Documents
Culture Documents
лаб2
лаб2
Звіт
з лабораторної роботи № 2
з дисципліни: “Паралельні та розподілені обчислення”
на тему: “Паралельне представлення алгоритмів”
Львів – 2019
Мета лабораторної роботи
Теоретичні відомості
1. Векторизація
Це процес генерації паралельних машинних кодів на основі послідовного алгоритму,
записаного на деякій мові програмування. Вона виконується, як правило векторизуючим
компілятором (автоматично) і полягає у виявленні та аналізі залежностей між операторами з
метою паралельного виконання незалежних, невпорядкованих дій.
Приклад.
Розглянемо задачу множення матриці на вектор, яка описується формулою:
N
c i= ∑ A ij b j
j=1 (1)
Безпосередня реалізація на послідовній мові програмування (в даному випадку – на
мові СІ) має вигляд:
for (i=0; i<N;i++)
{
c[i]=0;
for (j=0; j<N; j++)
c[i]=c[i]+A[i][j]*b[j];
}
В цій програмі с[і] переписується багато разів з метою економії пам’яті. Таким чином,
значення с[і] присвоюється більше одного разу. При перетворенні цієї ж програми в
програму з одноразовим присвоюванням кількість індексів векора с – зросте:
for (i=0; i<N;i++)
{
c[i][0]=0;
for (j=0; j<N; j++)
c[i][j+1]=c[i][j]+A[i][j]*b[j];
}
Тепер, кожному елементу вектора с буде присвоєно лише одне значення, а остаточні
значення будуть отримані на останньому кроці ітерації.
2
2.3. Рекурсивний алгоритм –це алгоритм, який визначається за допомогою правила
індексами якщо один індекс використовується для часу, а інші – для простору (надалі –
індексний простір).
Приклад.
Для випадку множення матриці на вектор, рекурсивне рівняння буде мати вигляд:
2.4. Граф залежностей (ГЗ) - це граф, який описує залежність обчислень в алгоритмі.
називається повним, якщо він визначає всі залежності між всіма змінними в індексному
і граф є скороченим..
3
j C(1) C(2) C(3) C(4)
B(4)
4
B(3)
3
B(2)
2
B(1)
1
1 2 3 4 i
З нього видно, що значення b[j] кожного елемента вектора b має бути розповсюджене у
всі індексні точки, що мають однаковий індекс j. Цей тип даних називається
“поширюваними” даними. Це означає, що має бути глобальний зв’язок, що не завжди
прийнятна умова для обчислювальної системи.
Можна стверджувати, що алгоритм є зчисленним, якщо його повний граф не містить
петель і циклів
в ній b[i+1][j] безпосередньо залежить від b[i][j], а c[i][j+1] від c[i][j], A[i][j], b[i][j].
4
j C(1) C(2) C(3) C(4)
B(4)
4
B(3)
3
B(2)
2
1 B(1)
1 2 3 4 i
5
Завдання
де А та В матриці з елементами
aij та
bij , відповідно( i, j=1... N ), тобто:
N
y ij= ∑ aik b kj
k=1 ( k =1. .. N ) .
Графи залежностей (n = 4)
A c 41 c 42 c 43 c c
44
44
A 11
44
c c c c c
A B B
31 32 34 34
34
33
34 A 12 34
A c21 c c c c
24
22 23 24
A13
24
c c c c B 24
c B 24
A 14
11 12 13 14
A 14
14
B c
13
B
A 13
14
A 13
14
c12
A 12 A 12
c
11
A 11 A 11
6
Текст програми
#include <iostream>
#include <stdio.h>
#include <iomanip>
using namespace std;
void func(int** arr, int n)
{
for (int i = 0; i<n; i++)
{
for (int j = 0; j < n; j++)
arr[i][j] = 0;
}
7
{
int **A, **B, **C, n;
cout << "Enter n";
cin >> n;
B = new int*[n];
for (int i = 0; i < n; i++)
{
B[i] = new int[n];
}
A = new int*[n];
for (int i = 0; i < n; i++)
{
A[i] = new int[n];
}
C = new int*[n];
for (int i = 0; i < n; i++)
{
C[i] = new int[n];
}
8
Рис. 1 Результат виконання програми
Висновок