Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лаб. 3 ТПП

.docx
Скачиваний:
2
Добавлен:
29.12.2024
Размер:
208.52 Кб
Скачать

Лабораторная работа №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;

}

Соседние файлы в предмете Технологии параллельного программирования