Professional Documents
Culture Documents
ПП Лаб 6 Володін
ПП Лаб 6 Володін
Паралельне програмування
Лабораторна робота №6
«Бібліотека МРІ»
Виконав:
студент групи ІО-11
Володін В. В.
Перевірив:
Корочкін О.В
Київ – 2023
Тема: «Бібліотека МРІ».
Мета роботи: розробка програми для ПКС СП.
Мова програмування: C++.
Засоби організації взаємодії процесів: посилання повідомлень
(Send/Receive, колективні операції Bcast, Scatter та граф зв’язку).
Варіант:
Вихідна функція
Z=X*(MA*MS) + min(X)*F
Етап1. Побудова паралельного алгоритму:
N – розмір векторів та матриць
P – кількість потоків
H = N/P
1. ci = min(XH)
2. c = max(c, ci) --CP - a
3. ZH = XH*(MAH*MSH) + c*FH --CP - a
1. Введення MA
2. Передати MA задачі Т2
4. Обчислення с1 = min(XH)
5. Передати c1 задачі Т2
Задача T2
1. Введення X
6. Обчислення с2 = min(XH)
12.Вивід Z
Задача T3
1. Введення MS
2. Передати MS задачі Т2
4. Обчислення с3 = min(XH)
5. Передати c3задачі Т2
Задача T4
1. Введення F
2. Передати F задачі Т2
4. Обчислення с4 = min(XH)
5. Передати c4задачі Т2
const int P = 4;
const int N = 4;
const int H = N / P;
void Calculation3(int Xi[], int MAi[][N], int MSh[][H], int c, int Fh[], int result[]);
void matrixMultiply(int matrix[][N], int submatrix[][H], int submatrix_result[][H]);
void vectorOnMatrixMultiply(int vector[], int submatrix[][H], int subvector_result[]);
void vectorMultiplyNumber(int vector[], int number, int size);
void vectorSum(int vector1[], int vector2[], int size);
void fillMatrix(int matrix[][N], int number);
void fillVector(int vector[], int number);
void printVector(int vector[], int size);
int vectorMin(int vector[], int size);
int min(int a, int b);
int number = 1;
int numtasks, rank;
int X[N];
int MA[N][N];
int MSh[N][H];
int Xh[H];
int Fh[H];
int ci = 0;
int ci_arr[P];
int c;
int Z[N];
int Zh[H];
MPI_Init(argc, &argv);
MPI_Status status;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &numtasks);
if (rank == 0)
{
int MA[N][N];
fillMatrix(MA, number);
MPI_Send(MA, N * N, MPI_INT, 1, 21, MPI_COMM_WORLD);
}
if (rank == 1)
{
fillVector(X, number);
MPI_Recv(MA, N * N, MPI_INT, 0, 21, MPI_COMM_WORLD, &status);
MPI_Recv(buf_MS, N * N, MPI_INT, 2, 23, MPI_COMM_WORLD, &status);
int F[N];
MPI_Recv(F, N, MPI_INT, 3, 24, MPI_COMM_WORLD, &status);
buf_F = F;
}
if (rank == 2)
{
int MS[N][N];
fillMatrix(MS, number);
MPI_Send(&MS, N * N, MPI_INT, 1, 23, MPI_COMM_WORLD);
}
if (rank == 3)
{
int F[N];
fillVector(F, number);
MPI_Send(F, N, MPI_INT, 1, 24, MPI_COMM_WORLD);
}
MPI_Bcast(X, N, MPI_INT, 1, MPI_COMM_WORLD);
MPI_Bcast(MA, N * N, MPI_INT, 1, MPI_COMM_WORLD);
MPI_Scatter(buf_MS, N * H, MPI_INT, MSh, N * H, MPI_INT, 1,
MPI_COMM_WORLD);
MPI_Scatter(X, H, MPI_INT, Xh, H, MPI_INT, 1, MPI_COMM_WORLD);
MPI_Scatter(buf_F, H, MPI_INT, Fh, H, MPI_INT, 1, MPI_COMM_WORLD);
ci = vectorMin(Xh, H);
MPI_Gather(&ci, 1, MPI_INT, ci_arr, 1, MPI_INT, 1, MPI_COMM_WORLD);
if (rank == 1)
c = vectorMin(ci_arr, P);
MPI_Bcast(&c, 1, MPI_INT, 1, MPI_COMM_WORLD);
Calculation3(X, MA, MSh, c, Fh, Zh);
MPI_Gather(Zh, H, MPI_INT, Z, H, MPI_INT, 1, MPI_COMM_WORLD);
if (rank == 1)
printVector(Z, N);
MPI_Finalize();
return 0;
}
void Calculation3(int Xi[], int MAi[][N], int MSh[][H], int c, int Fh[], int result[])
{
int temp_MRh[N][H];
matrixMultiply(MAi, MSh, temp_MRh);
vectorOnMatrixMultiply(Xi, temp_MRh, result);
vectorMultiplyNumber(Fh, c, H);
vectorSum(result, Fh, H);
}
Висновок
У результаті виконання лабораторної роботи створена програма на мові
С++ яка виконує паралельні обчислення. Програма реалізована за
допомогою бібліотеки MPI (Message Passing Interface).