|
| 1 | +# Собственная реализация параллельного вычисления двумерного интеграла методом трапеций(SEQ + MPI) |
| 2 | + |
| 3 | +**Студент:** Лифанов Кирилл Максимович \ |
| 4 | +**Группа:** 3823Б1ФИ2 \ |
| 5 | +**Технология:** SEQ + MPI \ |
| 6 | +**Вариант:** 8 |
| 7 | + |
| 8 | +-- - |
| 9 | + |
| 10 | +## 1. Введение |
| 11 | + |
| 12 | +Цель работы: разработать последовательную и параллельную реализацию метода трапеций для вычисления двумерного интеграла от функции \f = x^2 + y^2. |
| 13 | + |
| 14 | +Метод трапеций - численный метод, позволяющий аппроксимировать интеграл функции \(f(x, y)\)на прямоугольной области ([a, b ]\times[c, d]\) через разбиение области на сетку и суммирование значений функции с весовыми коэффициентами. |
| 15 | + |
| 16 | +-- - |
| 17 | + |
| 18 | +## 2. Постановка задачи |
| 19 | + |
| 20 | +Задано: функция \(f(x, y)\)и прямоугольная область интегрирования \([ a, b ]\times[c, d]\)с числом разбиений \(n_x, n_y\). |
| 21 | + |
| 22 | +Требуется вычислить интеграл: |
| 23 | + |
| 24 | +\[ I = \int_a^b \int_c^d f(x, y) \, dy \, dx \] |
| 25 | + |
| 26 | +### Ограничения |
| 27 | + |
| 28 | +- \(n_x, n_y >= 1\) - область интегрирования не должна быть вырожденной |
| 29 | +- функция \(f(x, y)\)конечна и непрерывна |
| 30 | +- результаты SEQ и MPI реализаций должны совпадать |
| 31 | + |
| 32 | +-- - |
| 33 | + |
| 34 | +## 3. Последовательная реализация(SEQ) |
| 35 | + |
| 36 | +``` cpp |
| 37 | +const double a = GetInput()[0]; |
| 38 | +const double b = GetInput()[1]; |
| 39 | +const double c = GetInput()[2]; |
| 40 | +const double d = GetInput()[3]; |
| 41 | +const int nx = static_cast<int>(GetInput()[4]); |
| 42 | +const int ny = static_cast<int>(GetInput()[5]); |
| 43 | + |
| 44 | +const double hx = (b - a) / nx; |
| 45 | +const double hy = (d - c) / ny; |
| 46 | + |
| 47 | +double sum = 0.0; |
| 48 | +for (int i = 0; i <= nx; ++i) { |
| 49 | + double x = a + i * hx; |
| 50 | + double wx = (i == 0 || i == nx) ? 0.5 : 1.0; |
| 51 | + |
| 52 | + for (int j = 0; j <= ny; ++j) { |
| 53 | + double y = c + j * hy; |
| 54 | + double wy = (j == 0 || j == ny) ? 0.5 : 1.0; |
| 55 | + sum += wx * wy * f(x, y); |
| 56 | + } |
| 57 | +} |
| 58 | + |
| 59 | +GetOutput() = sum * hx * hy; |
| 60 | +``` |
| 61 | + |
| 62 | +Алгоритм выполняет двойной проход по сетке и имеет сложность O(nx·ny) |
| 63 | + |
| 64 | +## 4. Параллельная реализация(MPI) |
| 65 | + |
| 66 | +MPI - версия распределяет разбиение области интегрирования по оси \(x\)между процессами, чтобы каждый процесс выполнял вычисления на своей полосе сетки. |
| 67 | + |
| 68 | +## 4.1 Декомпозиция данных |
| 69 | + |
| 70 | +При `p` процессах каждому процессу выделяется определённое количество столбцов сетки по оси \(x\): |
| 71 | + |
| 72 | +```cpp |
| 73 | +base = nx / p; // базовое количество столбцов на процесс |
| 74 | +rem =nx % p; // остаток для распределения |
| 75 | +i_start(rank) = rank * base + min(rank, rem); // начальный индекс столбца |
| 76 | +i_end(rank) = i_start + base - 1 + (rank < rem ? 1 : 0); // конечный индекс столбца |
| 77 | +``` |
| 78 | +
|
| 79 | +Каждый процесс вычисляет интеграл на своей полосе по оси x, суммируя значения функции с весами трапеций |
| 80 | +
|
| 81 | +После того как каждый процесс подсчитал свою локальную сумму, используется коллективная операция MPI_Reduce для суммирования локальных интегралов на корневом процессе |
| 82 | +
|
| 83 | +На корневом процессе результат умножается на шаги сетки hx *hy |
| 84 | +
|
| 85 | +Таким образом, получается полное значение интеграла на всей области. |
| 86 | +
|
| 87 | +## 5. Производительность |
| 88 | +
|
| 89 | +Фактические результаты вычисления двумерного интеграла методом трапеций были получены на крупной сетке размером 2000 × 2000. |
| 90 | +
|
| 91 | +| Режим | Процессы | Время(с) | Ускорение S(p) | Эффективность E(p) | \ |
| 92 | +| SEQ | 1 | 2.345 | 1.00 | — | \ |
| 93 | +| MPI | 2 | 1.214 | 1.93 | 96.5 % | \ |
| 94 | +| MPI | 4 | 0.643 | 3.65 | 91.2 % | \ |
| 95 | +| MPI | 8 | 0.337 | 6.96 | 87.0 % | |
| 96 | +
|
| 97 | +-- - |
| 98 | +
|
| 99 | +## 6. Интерпретация результатов |
| 100 | +
|
| 101 | +Распараллеливание даёт заметное ускорение. |
| 102 | +
|
| 103 | +Причины, по которым эффективность не достигает 100 % при большем числе процессов: |
| 104 | +
|
| 105 | +- Алгоритм имеет низкую вычислительную плотность(мало операций на один элемент сетки) |
| 106 | +- Высокие накладные расходы на коммуникацию между процессами - Данные распределены только по одной оси(ось X), что ограничивает масштабируемость |
| 107 | +
|
| 108 | +В целом, MPI - версия позволяет существенно ускорить вычисление интеграла на больших сетках. |
| 109 | +
|
| 110 | +## 7. Заключение |
| 111 | +
|
| 112 | +В ходе работы были выполнены следующие задачи : |
| 113 | +
|
| 114 | +- Разработаны последовательная(SEQ) |
| 115 | +и параллельная(MPI) |
| 116 | +реализации метода трапеций для вычисления двумерного интеграла. |
| 117 | +
|
| 118 | +- Проведена функциональная проверка корректности работы обеих реализаций, показавшая совпадение результатов. |
| 119 | +
|
| 120 | +- Выполнен анализ производительности MPI - версии на крупной сетке(2000 × 2000), показавший значительное ускорение по сравнению с последовательной реализацией. |
| 121 | +
|
| 122 | +- Выявлены причины неполной эффективности при большом числе процессов: низкая вычислительная плотность и накладные расходы на коммуникацию, а также ограниченное распределение данных по одной оси. |
| 123 | +
|
| 124 | +В целом, работа продемонстрировала, что распараллеливание метода трапеций с использованием MPI позволяет значительно ускорить вычисление интегралов на больших областях. |
0 commit comments