Skip to content

Commit 3809418

Browse files
chekalexeyAlexey_chekotov
andauthored
Чёкотов Алексей. Технология SEQ-MPI. Построение выпуклой оболочки для компонент бинарного изображения. Вариант 32 (#281)
<!-- Требования к названию pull request: "<Фамилия> <Имя>. Технология <TECHNOLOGY_NAME:SEQ|OMP|TBB|STL|MPI>. <Полное название задачи>. Вариант <Номер>" --> ## Описание <!-- Пожалуйста, предоставьте подробное описание вашей реализации, включая: - основные детали решения (описание выбранного алгоритма) - применение технологии параллелизма (если применимо) --> - **Задача**: Построение выпуклой оболочки для компонент бинарного изображения - **Вариант**: 32 - **Технология**: SEQ, MPI - **Описание** Для поиска связных компонент в бинарном изображении применяется обход в ширину (BFS), который проверяет соседние пиксели сверху, снизу, слева и справа. После нахождения всех точек компоненты для построения её выпуклой оболочки используется алгоритм Эндрю. Он сортирует точки, затем строит нижнюю и верхнюю части оболочки для каждой компоненты с помощью скалярного произведения. Технологии параллелизма: Изображение распределяется построчно между процессами. Чтобы правильно обрабатывать компоненты на границах этих полос, процессы обмениваются своими крайними строками с соседями. После все процессы вычисляют выпуклые оболочки в своих зонах и результаты синхронизируются между процессами. ## Чек-лист <!-- Пожалуйста, убедитесь, что следующие пункты выполнены **до** отправки pull request'а и запроса его ревью: --> - [x] **Статус CI**: Все CI-задачи (сборка, тесты, генерация отчёта) успешно проходят на моей ветке в моем форке - [x] **Директория и именование задачи**: Я создал директорию с именем `<фамилия>_<первая_буква_имени>_<короткое_название_задачи>` - [x] **Полное описание задачи**: Я предоставил полное описание задачи в теле pull request - [x] **clang-format**: Мои изменения успешно проходят `clang-format` локально в моем форке (нет ошибок форматирования) - [x] **clang-tidy**: Мои изменения успешно проходят `clang-tidy` локально в моем форке (нет предупреждений/ошибок) - [x] **Функциональные тесты**: Все функциональные тесты успешно проходят локально на моей машине - [x] **Тесты производительности**: Все тесты производительности успешно проходят локально на моей машине - [x] **Ветка**: Я работаю в ветке, названной точно так же, как директория моей задачи (например, `nesterov_a_vector_sum`), а не в `master` - [x] **Правдивое содержание**: Я подтверждаю, что все сведения, указанные в этом pull request, являются точными и достоверными <!-- ПРИМЕЧАНИЕ: Ложные сведения в этом чек-листе могут привести к отклонению PR и получению нулевого балла за соответствующую задачу. --> --------- Co-authored-by: Alexey_chekotov <alexche2509.@gmail.com>
1 parent 3983e8d commit 3809418

11 files changed

Lines changed: 1137 additions & 0 deletions

File tree

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
#pragma once
2+
3+
#include <tuple>
4+
#include <utility>
5+
#include <vector>
6+
7+
#include "task/include/task.hpp"
8+
9+
namespace chyokotov_a_convex_hull_finding {
10+
11+
using InType = std::vector<std::vector<int>>;
12+
using OutType = std::vector<std::vector<std::pair<int, int>>>;
13+
using TestType = std::tuple<std::vector<std::vector<int>>, std::vector<std::vector<std::pair<int, int>>>>;
14+
using BaseTask = ppc::task::Task<InType, OutType>;
15+
16+
} // namespace chyokotov_a_convex_hull_finding
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"student": {
3+
"first_name": "Алексей",
4+
"last_name": "Чёкотов",
5+
"middle_name": "Павлович",
6+
"group_number": "3823Б1ФИ2",
7+
"task_number": "3"
8+
}
9+
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
#pragma once
2+
3+
#include <cstdint>
4+
#include <utility>
5+
#include <vector>
6+
7+
#include "chyokotov_a_convex_hull_finding/common/include/common.hpp"
8+
#include "task/include/task.hpp"
9+
10+
namespace chyokotov_a_convex_hull_finding {
11+
12+
class ChyokotovConvexHullFindingMPI : public BaseTask {
13+
public:
14+
static constexpr ppc::task::TypeOfTask GetStaticTypeOfTask() {
15+
return ppc::task::TypeOfTask::kMPI;
16+
}
17+
explicit ChyokotovConvexHullFindingMPI(const InType &in);
18+
19+
private:
20+
bool ValidationImpl() override;
21+
bool PreProcessingImpl() override;
22+
bool RunImpl() override;
23+
bool PostProcessingImpl() override;
24+
25+
static bool Check(const std::vector<std::vector<int>> &input);
26+
std::pair<std::vector<int>, int> DistributeImageData(int rank, int size, int width, int height);
27+
static std::pair<int, int> CalculateRowDistribution(int rank, int size, int height);
28+
static int64_t Cross(const std::pair<int, int> &a, const std::pair<int, int> &b, const std::pair<int, int> &c);
29+
static std::vector<std::vector<std::pair<int, int>>> FindConnectedComponentsMPI(int rank, int size, int start_row,
30+
int end_row, int width, int height,
31+
const std::vector<int> &local_data);
32+
33+
static std::vector<std::pair<int, int>> ConvexHullAndrew(const std::vector<std::pair<int, int>> &points);
34+
35+
static void ExchangeBoundaryRows(bool has_top, bool has_bottom, int rank, int size, int width,
36+
const std::vector<int> &local_pixels, std::vector<int> &extended_pixels);
37+
38+
static std::vector<std::vector<std::pair<int, int>>> ProcessExtendedRegion(const std::vector<int> &extended_pixels,
39+
int extended_rows, int width,
40+
int global_y_offset);
41+
42+
static std::vector<std::pair<int, int>> ExtractComponent(int start_x, int start_y,
43+
const std::vector<int> &extended_pixels,
44+
std::vector<std::vector<bool>> &visited, int width,
45+
int extended_rows, int global_y_offset);
46+
47+
static std::vector<std::vector<std::pair<int, int>>> FilterLocalComponents(
48+
const std::vector<std::vector<std::pair<int, int>>> &all_components, int start_row, int end_row);
49+
50+
static void SendHullsToRank0(const std::vector<std::vector<std::pair<int, int>>> &local_hulls);
51+
static void ReceiveHullsFromRank(int src_rank, std::vector<int> &all_sizes, std::vector<int> &global_flat);
52+
53+
static std::vector<std::vector<std::pair<int, int>>> GatherHullsOnRank0(
54+
int rank, int size, const std::vector<std::vector<std::pair<int, int>>> &local_hulls);
55+
56+
static std::vector<std::vector<std::pair<int, int>>> ReconstructHulls(const std::vector<int> &hull_sizes,
57+
const std::vector<int> &flat_points);
58+
static std::vector<std::vector<std::pair<int, int>>> BroadcastResultToAllRanks(
59+
int rank, const std::vector<std::vector<std::pair<int, int>>> &global_hulls_on_rank0);
60+
};
61+
62+
} // namespace chyokotov_a_convex_hull_finding

0 commit comments

Comments
 (0)