Распараллеливание вычислений с помощью технологии OpenMP
Автор: Modest Dneprov • Декабрь 24, 2023 • Лабораторная работа • 1,521 Слов (7 Страниц) • 128 Просмотры
Министерство науки и высшего образования Российской Федерации федеральное государственное бюджетное образовательное учреждение[pic 1]
высшего профессионального образования
«Московский государственный технический университет имени Н.Э. Баумана (национальный исследовательский университет)»
(МГТУ им. Н.Э. Баумана)
ФАКУЛЬТЕТ «Робототехники и комплексной автоматизации» КАФЕДРА «Системы автоматизированного проектирования (РК-6)»
ОТЧЕТ О ВЫПОЛНЕНИИ ЛАБОРАТОРНОЙ РАБОТЫ
по дисциплине «Архитектура параллельных вычислительных систем»
Студент: Днепров Модест Анатольевич[pic 2]
Группа: РК6-12М
[pic 3]
Тип задания: лабораторная работа[pic 4][pic 5]
Тема: Распараллеливание вычислений с помощью технологии OpenMP
Студент Преподаватель
[pic 6]
подпись, дата
[pic 7]
подпись, дата
Днепров М.А.
Фамилия, И.О.
Спасёнов А.Ю.
Фамилия, И.О.
Москва, 2023
Содержание
1. Задание на лабораторную работу 3
2. Описание части программы для распараллеливания 4
3. Возможности OpenMP 6
4. Ускорение после распараллеливания 7
5. Визуализация ускорения 8
Задание на лабораторную работу
Цель данной работы заключалась в оптимизации программы, осуществляющей численное моделирование методом конечных разностей для решения уравнения теплопроводности. Необходимо было распараллелить часть программы с использованием технологии OpenMP для повышения производительности. Описать какая часть программы поддается распараллеливанию. Вычислить следующие параметры:
- Ускорение работы программы
- Эффективность распараллеливания ( в зависимости от числа используемых процессоров)
- Сложность задачи
- Значение функции изоэффективности
Визуализировать ускорение работы программы и продемонстрировать результат моделирования в графическом виде.
Описание части программы для распараллеливания
Мною было выбрано 2 участка программы для применения технологии OpenMP:
- Функция gauss, ответственная за решение системы линейных уравнений методом Гаусса.
void gauss(double** matrix, double sol_cur[], double sol_next[]) {
double** matr = new double* [N];
#pragma omp parallel for collapse(2)
for (int i = 0; i < N; i++)
matr[i] = new double[N];
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
matr[i][j] = matrix[i][j];
}
}
// Прямой ход метода Гаусса
for (int j = 0; j < N; j++) {
for (int i = j + 1; i < N; i++) {
double koef = matr[i][j] / matr[j][j];
for (int k = j; k < N; k++) {
matr[i][k] -= koef * matr[j][k];
}
sol_cur[i] -= koef * sol_cur[j];
}
}
// Обратный ход метода Гаусса
for (int i = N - 1; i >= 0; i--) {
double s = 0.0;
...