
Лаб. 3 ТПП
.docxЛабораторная работа №3
Использование редукции
Цель: изучить основные особенности использования редукции в OpenMP на примере использования в рамках языка С++.
Пример:
#include <iostream>
#include <omp.h>
const int NMAX = 5;
int main() {
setlocale(LC_ALL, "Rus");
int i, j;
float total = 0;
float sum;
float a[NMAX][NMAX];
for (i = 0; i < NMAX; i++)
for (j = 0; j < NMAX; j++)
a[i][j] = i + j;
#pragma omp parallel shared(a) reduction(+:total)
{
#pragma omp for private(i,j,sum)
for (i = 0; i < NMAX; i++)
{
sum = 0;
for (j = 0; j < NMAX; j++)
sum += a[i][j];
printf("Сумма элементов строки %d равна %f\n", i, sum);
total += sum;
}
} /* Завершение параллельного фрагмента */
printf("Сумма элементов матрицы равна %f\n", total);
}
Задание 1 и 2:
#include <iostream>
#include <omp.h>
#include <iomanip>
const int N = 500000;
using namespace std;
void main()
{
setlocale(LC_ALL, "Rus");
cout << "N: " << N << endl << endl;
int i;
int* a = new int[N];
int* b = new int[N];
int* c = new int[N];
srand(static_cast<unsigned int>(time(nullptr)));
for (i = 0; i < N; i++)
a[i] = rand() % 21 - 10;
for (i = 0; i < N; i++)
b[i] = rand() % 21 - 10;
double start_time = omp_get_wtime();
long total = 0;
#pragma omp parallel num_threads(3) shared(a,b,c) reduction(+:total)
{
#pragma omp for private(i)
for (i = 0; i < N; i++)
{
if (a[i] > b[i])
c[i] = a[i];
else
c[i] = b[i];
total += c[i];
}
}
double end_time = omp_get_wtime();
cout << "Задание 1" << endl;
cout << "Итоговая сумма: " << total << endl;
cout << "Время выполнения: " << fixed << setprecision(16) << (end_time - start_time) << " секунд" << endl;
double start_time2 = omp_get_wtime();
long total2 = 0;
for (i = 0; i < N; i++)
{
if (a[i] > b[i])
c[i] = a[i];
else
c[i] = b[i];
total2 += c[i];
}
double end_time2 = omp_get_wtime();
cout << "Задание 2" << endl;
cout << "Итоговая сумма: " << total2 << endl;
cout << "Время выполнения: " << fixed << setprecision(16) << (end_time2 - start_time2) << " секунд" << endl;
delete[] a;
delete[] b;
delete[] c;
}