МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ
РОССИЙСКОЙ ФЕДЕРАЦИИ
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ
БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ
ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
"ВЯТСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ"
Факультет прикладной математики и телекоммуникаций
Кафедра
радиоэлектронных средств
Лабораторные работы № 1 - 4
Параллельные
вычисления
Киров
2014
Лабораторная работа №1
Параллельные алгоритмы матрично-векторного умножения
Цель работы: разработка параллельной программы, которая выполняет умножение матриц на вектор.
. Реализация последовательного алгоритма
умножения матрицы на вектор.
Рисунок 1.1 - Задание размера матрицы
Рисунок 1.2 - Ввод данных простым способом
Рисунок 1.3 - Результат выполнения
матрично-векторного умножения
. Проведение вычислительных экспериментов
Вычисление времени выполнения алгоритма:
Таблица 1.1 - Сравнительная таблица работы
последовательного алгоритма
Размер
матрицы
Экспериментальное
время, с
Теоретическое
время, с
10
0,000091
0,00038
100
0,000177
0,0398
1000
0,006624
3,998
2000
0,018156
15,996
3000
0,039233
35,994
4000
0,064005
63,992
5000
0,102
99,99
6000
0,139
143,988
7000
0,236
195,986
8000
0,258
255,984
9000
0,309
323,982
10000
0,393
399,98
. Разработка параллельного алгоритма
умножения матрицы на вектор
Рисунок 1.4 - Печать количества и ранга
процессов
Рисунок 1.5 - Распределение данных
Рисунок 1.6 - Результат проверки умножения
матрицы на вектор
. Проведение вычислительных экспериментов
Таблица 1.2 - Сравнение времени работы
последовательного и параллельного алгоритмов
Размер
объектов
Последовательный
алгоритм, с
Параллельный
алгоритм
2
процесса
4
процесса
8
процессов
Время,
с
ускорение
Время,
с
ускорение
Время,
с
ускорение
10
0,000002
0,000003
0,67
0,000004
0,5
0,000003
0,67
100
0,000045
0,000022
2,045
0,000013
3,46
0,000008
5,625
1000
0,003988
0,00278
1,4345
0,001134
3,52
0,000545
7,32
2000
0,016664
0,008298
2,008
0,004478
3,72
0,002116
7,875
3000
0,033735
0,017384
1,94
0,010314
3,27
0,004806
7,019
4000
0,059323
0,03352
1,77
0,018750
3,16
0,011837
5,012
5000
0,094667
0,051625
1,834
0,029602
3,198
0,015779
5,99
6000
0,137
0,1001
1,369
0,040165
3,41
0,023406
5,85
7000
0,192
0,1007
1,91
0,055858
3,44
0,027571
6,96
8000
0,247
0,13
1,9
0,074295
3,33
0,035478
6,96
9000
0,318
0,161
1,975
0,093128
3,415
0,05137
6,19
10000
0,384
0,206
1,864
0,114
3,37
0,062096
6,184
Вывод:
. В ходе лабораторной работы были
разработаны 2 алгоритма вычисления произведения матрицы на вектор.
. Выявлено, что последовательный алгоритм
выполняется быстрее, чем последовательный, и с увеличением числа процессов,
время вычисления уменьшается.
Лабораторная работа №2
Параллельные алгоритмы матричного умножения
Цель работы: разработка параллельной программы,
которая выполняет умножение двух матриц.
. Реализация последовательного алгоритма
матричного умножения
Рисунок 2.1 - Задание размера объекта
Рисунок 2.2 - Ввод данных простым способом
Рисунок 2.3 - Результат выполнения
матрично-векторного умножения
Рисунок 2.4 - Задание данных с помощью
случайного генератора
. Проведение вычислительных экспериментов
Вычисление времени выполнения алгоритма:
Таблица 2.1 - Сравнительная таблица работы
последовательного алгоритма
Размер
матрицы
Экспериментальное
время, с
Теоретическое
время, с
10
0,000009
0,0000065
100
0,004949
0,0068
500
0,853
0,853
1000
13,438
6,827
1500
54,374
23,0464
2000
129,97
54,632985
2500
277,843
106,71
3000
483,046
184,40169
3. Разработка параллельного алгоритма
матричного умножения
Рисунок 2.5 - Определение ранга процесса
. Проведение вычислительных экспериментов
Таблица 2.2 - Сравнение работы последовательного
и параллельного алгоритмов
Размер
объектов
Последовательный
алгоритм, с
Параллельный
алгоритм
4
процесса
9
процессов
Время,
с
ускорение
Время,
с
ускорение
10
0,000009
0,00005
0,18
0,007362
0,001
100
0,004949
0,003443
1,437
0,023
0,215
500
0,853
0,255
3,345
0,375
2,275
1000
13,438
3,039
4,42
1,872
7,178
1500
54,374
17,057
3,19
5,811397
9,356
2000
129,97
33,23
3,91
21,47895
6,051
2500
277,843
85,074
3,266
40,23121
6,91
3000
483,046
130,373
3,705
56,60254
8,534
Вывод:
. В ходе лабораторной работы были
реализованы 2 алгоритма вычисление произведения матриц.
. Результаты работы последовательного и
параллельного алгоритма совпадают.
. Ускорение параллельного алгоритма,
относительно последовательного, пропорционально числу выполняемых процессов.
Лабораторная работа №3
Параллельные методы решения систем линейных
уравнений
Цель работы: разработка параллельной программы,
которая выполняет решение системы линейных уравнений методом Гаусса.
. Реализация последовательного алгоритма
Гаусса
Рисунок 3.1 - Результат работы последовательного
алгоритма
Рисунок 3.2 - Работа программы со случайными
числами
Рисунок 3.3 - Прямой ход, выбор ведущих строк
. Проведение вычислительных экспериментов
Вычисление времени выполнения алгоритма:
Таблица 3.1 - Сравнительная таблица работы
последовательного алгоритма
Размер
матрицы
Экспериментальное
время, с
Теоретическое
время, с
10
0,000015
0,000018
100
0,001978
0,001611
500
0,199
0,199
1000
1,647
1,589619
1500
5,89896
5,362286
2000
13,158849
12,70743
2500
26,066889
24,815479
3000
46,434393
42,876861
3. Разработка параллельного алгоритма
Гаусса
Рисунок 3.4 - Определение ранга процесса
Рисунок 3.5 - Результат выполнения прямого хода
метода Гаусса
4. Проведение вычислительных экспериментов
Таблица 3.2 - Сравнение работы последовательного
и параллельного алгоритмов
Размер
объектов
Последовательный
алгоритм, с
Параллельный
алгоритм
2
процесса
4
процесса
8
процессов ускорение
Время,
с
ускорение
Время,
с
ускорение
10
0,000015
0,000136
0,110294
0,000625
0,024
0,064815
0,000231
100
0,001978
0,002086
0,948226
0,003529
0,560499
0,442513
0,00447
500
0,199
0,112197
1,773666
0,088939
2,237489
3,381095
0,058857
1000
1,647
0,879686
1,872259
0,618633
2,662322
9,32891
0,176548
1500
5,89896
2,98725
1,974713
3,04487
1,937344
15,725795
0,375114
2000
13,158849
7,025873
1,872913
5,009367
2,626849
24,13871
0,545135
2500
26,066889
14,022705
1,858906
10,231977
2,547591
34,096514
0,764503
3000
46,434393
24,198062
1,91893
15,636958
2,969529
45,749477
1,014971
Вывод:
. В ходе лабораторной работы были
разработаны две программы для решения систем линейных уравнений методом Гаусса.
. Результаты работы программ совпадают.
. Параллельный алгоритм выполняется
быстрее последовательного.
Лабораторная работа №4
матрица вектор алгоритм
сортировка
Параллельные методы сортировки данных
Цель работы: разработка параллельной программы,
которая выполняет сортировку данных.
. Реализация последовательного алгоритма
сортировки данных
Рисунок 4.1 - Задание размера объекта
Рисунок 4.2 - Результат сортировки массива
. Проведение вычислительных экспериментов
Вычисление времени выполнения алгоритма:
Таблица 4.1 - Сравнительная таблица работы
последовательного алгоритма
Размер
матрицы
Экспериментальное
время, с
Теоретическое
время, с
При
использовании стандартных библиотек, с
10
0,000003
0,0000003
0,000007
100
0,000035
0,0000349
0,000018
10000
0,325979
0,35249672
0,001528
20000
1,454637
1,410057387
0,002973
30000
3,172682
3,172682
0,004271
40000
5,589694
5,64037056
0,0061
50000
8,924028
8,813123066
0,008473
. Разработка параллельного алгоритма
сортировки
Рисунок 4.3 - Результат работы параллельной
программы
. Проведение вычислительных экспериментов
Таблица 4.2 - Сравнение работы последовательного
и параллельного алгоритмов
Размер
объектов
Последовательный
алгоритм, с
При
использовании стандартных библиотек, с
Параллельный
алгоритм
2
процесса
Время,
с
Ускорение
1
Ускорение
2
10
0,000003
0,000007
0,000028
0,107143
0,25
100
0,000035
0,000018
0,000038
0,921053
0,473684
10000
0,325979
0,001528
0,1112
2,931466
0,013741
20000
1,454637
0,002973
0,302582
4,807414
0,009825
30000
3,172682
0,004271
0,690155
4,597057
0,006188
40000
5,589694
0,0061
1,219006
4,585452
0,005004
50000
8,924028
0,008473
2,002792
4,455794
0,004231
Параллельный
алгоритм
4
процесса
8
процессов
Время,
с
Ускорение
1
Ускорение
2
Время,
с
Ускорение
1
Ускорение
2
0,000054
0,055556
0,12963
0,018494
0,000162
0,000379
0,000061
0,57377
0,295082
0,036119
0,000969
0,000498
0,086117
3,785304
0,017743
0,033827
9,636651
0,045171
0,090653
16,04621
0,032795
0,092735
15,68595
0,032059
0,201978
15,70806
0,021146
0,167749
18,91327
0,025461
0,355119
15,74034
0,017177
0,228482
24,46448
0,026698
0,541799
16,4711
0,015639
0,285105
31,30085
0,029719
В таблице 4.2 "Ускорение 1"
соответствует значению ускорения времени выполнения параллельного алгоритма
относительно практически полученного времени выполнения последовательного
алгоритма, а "Ускорение 2" - ускорение, взятое в сравнении со
временем работы последовательного алгоритма при использовании в нем стандартных
библиотек.
Вывод:
. В ходе лабораторной работы были
разработаны последовательный и параллельный алгоритмы для сортировки данных.
. При использовании стандартных библиотек
время вычисления алгоритма значительно сокращается.
Индивидуальное задание.
Формулировка:
Дана матрица случайных чисел (равномерно
распределенных на интервале [0,r] , где r - параметр, передаваемый в функцию),
размера N*N
. Отсортировать строки матрицы в порядке убывания суммы элементов строк.
Код программы:
#include <stdio.h> #include
<stdlib.h> #include <time.h> #include <math.h> #include
<mpi.h> #define N 5 int A[N][N]; int B[N][N]; void fill_matrix() { int
i,j; srand (time(NULL)); for(i = 0; i < N; i ++) for(j = 0; j < N; j
++) A[i][j]=rand()%30; } void print_matrix() { int i,j; for(i = 0; i < N;
i ++) { for(j = 0; j < N; j ++) printf("%d ", A[i][j]);
printf("\n"); } } int main(int argc, char* argv[]) { int r, i, j,
k, temp, temp1; int D[N]; MPI_Status st; MPI_Datatype typ;
MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &r); if(r
== 0) { fill_matrix(); printf("\n Source:\n"); print_matrix();
printf("\n"); for(i = 0; i < N; i ++) { for(j = 0; j < (N);
j++) { B[i][j]=A[i][j]; }}
MPI_Barrier(MPI_COMM_WORLD);
MPI_Send(A, N*N, MPI_INT, 1, 0, MPI_COMM_WORLD); } else if(r == 1) {
MPI_Barrier(MPI_COMM_WORLD); MPI_Recv(B, N*N, MPI_INT, 0, 0, MPI_COMM_WORLD,
&st); for(i = 0; i < N; i ++) { D[i]=0; for(j = 0; j < (N); j++) {
D[i]=D[i]+B[i][j]; } } for(i = 0; i < N; i ++) { printf("%d ",
D[i]); printf("\n"); } for(i = 0; i < N- 1; i++) { for(k = i +
1; k < N; k++) { for (j=0 ; j<N; j++) { if (D[i] < D[k]) { temp =
D[i]; D[i] = D[k]; D[k] = temp; temp1 = B[i][j]; B[i][j] = B[k][j]; B[k][j] =
temp1; } } } } printf("\n"); printf("\n
Otsortirovannaya:\n"); for(i = 0; i < N; i ++) { for(j = 0; j < N;
j ++) printf("%d ", B[i][j]); printf("\n"); }}
MPI_Finalize(); return 0; }
Результат работы программы:
Вывод: В ходе проделанной работы был разработан
алгоритм для сортировки данных. Посчитали сумму элементов строк, а затем
отсортировали матрицу по убыванию этой суммы элементов.
![]()
![]()
![]()