Skip to content

Commit a2d617e

Browse files
authored
Смышляев Александр. Технология SEQ-MPI. Линейная фильтрация изображений (блочное разбиение). Ядро Гаусса 3x3. Вариант 28. (#156)
## Описание - **Задача**: Линейная фильтрация изображений (блочное разбиение). Ядро Гаусса 3x3. - **Вариант**: 28 - **Технология**: SEQ, MPI - **Описание** **SEQ:** Последовательный алгоритм реализует классическую операцию свертки, проходя по каждому пикселю изображения. Для каждого пикселя вычисляется взвешенная сумма значений его самого и восьми соседей, используя ядро Гаусса 3x3. Обработка граничных пикселей выполняется с помощью дублирования крайних значений. **MPI:** Параллельный алгоритм разбивает изображение на двумерную сетку блоков и распределяет эти блоки между процессами. Для корректной обработки пикселей на границах каждый блок данных дополняется рамкой толщиной в 1 пиксель, содержащей данные из соседних блоков. Корневой процесс подготавливает и рассылает эти расширенные блоки с помощью `MPI_Scatterv`. После этого каждый процесс независимо применяет фильтр Гаусса к своему блоку данных. Вычисленные локальные блоки результирующего изображения собираются на корневом процессе с помощью `MPI_Gatherv`, и итоговый результат рассылается всем участникам. --- ## Чек-лист - [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, являются точными и достоверными
1 parent c5091fe commit a2d617e

11 files changed

Lines changed: 769 additions & 0 deletions

File tree

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
#pragma once
2+
3+
#include <cstdint>
4+
#include <string>
5+
#include <tuple>
6+
#include <vector>
7+
8+
#include "task/include/task.hpp"
9+
10+
namespace smyshlaev_a_gauss_filt {
11+
struct ImageType {
12+
int width = 0;
13+
int height = 0;
14+
int channels = 0;
15+
std::vector<uint8_t> data;
16+
};
17+
18+
using InType = ImageType;
19+
using OutType = ImageType;
20+
using TestType = std::tuple<int, int, int, std::vector<uint8_t>, std::string>;
21+
using BaseTask = ppc::task::Task<InType, OutType>;
22+
23+
} // namespace smyshlaev_a_gauss_filt
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: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
#pragma once
2+
3+
#include <cstdint>
4+
#include <vector>
5+
6+
#include "smyshlaev_a_gauss_filt/common/include/common.hpp"
7+
#include "task/include/task.hpp"
8+
9+
namespace smyshlaev_a_gauss_filt {
10+
11+
class SmyshlaevAGaussFiltMPI : public BaseTask {
12+
public:
13+
static constexpr ppc::task::TypeOfTask GetStaticTypeOfTask() {
14+
return ppc::task::TypeOfTask::kMPI;
15+
}
16+
explicit SmyshlaevAGaussFiltMPI(const InType &in);
17+
18+
private:
19+
struct BlockInfo {
20+
int start_row;
21+
int start_col;
22+
int block_height;
23+
int block_width;
24+
int padded_height;
25+
int padded_width;
26+
int count;
27+
};
28+
29+
struct DecompositionInfo {
30+
int grid_rows = 0;
31+
int grid_cols = 0;
32+
std::vector<BlockInfo> blocks;
33+
std::vector<int> sendcounts;
34+
std::vector<int> displs;
35+
};
36+
37+
bool RunSequential();
38+
void BroadcastImageDimensions(int &width, int &height, int &channels);
39+
static void SetupDecomposition(DecompositionInfo &info, int width, int height, int channels);
40+
std::vector<uint8_t> PrepareScatterBuffer(const DecompositionInfo &info, int width, int height, int channels);
41+
std::vector<uint8_t> ProcessLocalBlock(const DecompositionInfo &info, int width, int height, int channels);
42+
void CollectResult(const std::vector<uint8_t> &local_result, const DecompositionInfo &info, int width, int height,
43+
int channels);
44+
bool ValidationImpl() override;
45+
bool PreProcessingImpl() override;
46+
bool RunImpl() override;
47+
bool PostProcessingImpl() override;
48+
};
49+
50+
} // namespace smyshlaev_a_gauss_filt

0 commit comments

Comments
 (0)