Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа 1 Никитина Дарья ПИН-31Д.docx
Скачиваний:
12
Добавлен:
16.07.2021
Размер:
238.03 Кб
Скачать

Лабораторная работа 1

Технология программирования openmp

никитина дарья пин-31д

Выполнить представленные в лабораторной примеры и занести в отчет результаты выполнения.

Пример 1.

#include <stdio.h>

#include <omp.h> // заголовочный файл «omp.h»

void main() {

/* Выделение параллельного фрагмента*/

#pragma omp parallel

{

printf("Hello World !\n");

}

/* Завершение параллельного фрагмента */

}

Пример 2.

#include <stdio.h>

#include <locale.h>

#include <omp.h>

const int NMAX = 100;

Void main()

{

setlocale(LC_ALL, "Rus");

int i, j;

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) private(i)

{

#pragma omp for private(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);

}

} /* Завершение параллельного фрагмента */

}.

Продемонстрировать выполнение лабораторных заданий.

Задание 1. Вариант 0.

#include <stdio.h>

#include <omp.h>

#include <locale.h>

#include <time.h>

const int NMAX = 500;

Void main()

{

setlocale(LC_ALL, "Rus");

int i, j, k;

int sum, p;

int a[NMAX][NMAX];

for (i = 0; i < NMAX; i++)

for (j = 0; j < NMAX; j++)

a[i][j] = i + j;

double t1, t2, dt;

t1 = omp_get_wtime();

#pragma omp parallel shared(a) private(i)

{

#pragma omp for private(j,sum,k,p)

for (i = 0; i < NMAX; i++)

{

sum = 0;

for (j = 0; j < NMAX; j++)

for (k = j + 1; k < NMAX; k++)

{

p = (a[i][j] * a[i][k]);

while (p > 0)

{

if (p % 2 == 1)

sum += 1;

p = p / 2;

}

}

printf("Количество единиц в строке %d: %d\n", i, sum);

}

}

t2 = omp_get_wtime();

dt = t2 - t1;

printf("Программа работала %f секунд.\n", dt);

}

Задание 2.

#include <stdio.h>

#include <omp.h>

#include <locale.h>

#include <time.h>

const int NMAX = 500;

Void main()

{

setlocale(LC_ALL, "Rus");

int i, j, k;

int sum, p;

int a[NMAX][NMAX];

for (i = 0; i < NMAX; i++)

for (j = 0; j < NMAX; j++)

a[i][j] = i + j;

double t1, t2, dt;

t1 = omp_get_wtime();

for (i = 0; i < NMAX; i++)

{

sum = 0;

for (j = 0; j < NMAX; j++)

for (k = j + 1; k < NMAX; k++)

{

p = (a[i][j] * a[i][k]);

while (p > 0)

{

if (p % 2 == 1)

sum += 1;

p = p / 2;

}

}

printf("Количество единиц в строке %d: %d\n", i, sum);

}

t2 = omp_get_wtime();

dt = t2 - t1;

printf("Программа работала %f секунд.\n", dt);

}

Сравнение результатов:

Программа с использованием технологии OpenMP отработала в разы быстрее, что удобно при больших вычислениях.

Ответить на контрольные вопросы.

1. В чем состоят основы технологии OpenMp?

В основе лежит активно развивающийся в последнее время подход к разработке параллельных программ, когда указания программиста по организации параллельных вычислений добавляются в программу при помощи тех или иных внеязыковых средств языка программирования – например, в виде директив или комментариев, которые обрабатываются специальным препроцессором до начала компиляции программы. При этом исходный текст программы остается неизменным, и по нему, в случае отсутствия препроцессора, компилятор построит исходный последовательный программный код. Препроцессор же, будучи примененным, заменяет директивы параллелизма на некоторый дополнительный программный код (как правило, в виде обращений к процедурам какой-либо параллельной библиотеки).