Skip to content

Клименко Владислав. Технология ALL + отчёт. Повышение контраста полутонового изображения посредством линейной растяжки гистограммы. Вариант 28#564

Open
limdizz wants to merge 3 commits intolearning-process:masterfrom
limdizz:klimenko_v_lsh_contrast_incr_all

Conversation

@limdizz
Copy link
Copy Markdown
Contributor

@limdizz limdizz commented Apr 4, 2026

Общее описание

Алгоритм реализует двухуровневый параллелизм для повышения контрастности полутонового изображения методом линейной растяжки гистограммы. Комбинирует MPI для межпроцессного взаимодействия (распределение данных между узлами) и STL threads для внутрипроцессного параллелизма (многоядерная обработка на каждом узле).

Подробное описание

  1. Валидация (ValidationImpl)
  • Проверяет, инициализирован ли MPI.

  • На процессе 0 проверяет, что входные данные не пустые.

  • Остальные процессы всегда возвращают true.

  1. Предварительная обработка (PreProcessingImpl)
  • Выделяет память под выходные данные на процессе 0.

  • Размер выходного буфера соответствует входному.

  1. Основной алгоритм (RunImpl)

Шаг 1: Инициализация MPI и синхронизация.

int rank = 0, size = 1;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);

Получение ранга текущего процесса.

Получение общего количества MPI процессов.

Шаг 2: Распределение данных между MPI процессами

MPI_Bcast(&total_size, 1, MPI_INT, 0, MPI_COMM_WORLD);
int chunk = total_size / size;
int remainder = total_size % size;
for (int i = 0; i < size; i++) {
    recv_counts[i] = chunk + (i < remainder ? 1 : 0);
    displs[i] = (i == 0) ? 0 : displs[i - 1] + recv_counts[i - 1];
}
MPI_Scatterv(...)

Процесс 0 рассылает размер данных всем процессам.

Вычисляется размер блока для каждого процесса (равномерное распределение с учётом остатка).

Данные распределяются с помощью MPI_Scatterv.

Шаг 3: Локальный поиск min/max (STL потоки).

auto [local_min, local_max] = FindMinMaxSTL(local_data, num_stl_threads);

Функция FindMinMaxSTL:

Разбивает локальный блок данных на подблоки (по количеству STL потоков).

Каждый поток находит свой локальный min/max.

Результаты объединяются через std::min_element / std::max_element.

Шаг 4: Глобальная редукция.

MPI_Allreduce(&local_min, &global_min, 1, MPI_INT, MPI_MIN, MPI_COMM_WORLD);
MPI_Allreduce(&local_max, &global_max, 1, MPI_INT, MPI_MAX, MPI_COMM_WORLD);

Находит глобальный минимум среди всех MPI процессов.

Находит глобальный максимум среди всех MPI процессов.

Шаг 5: Преобразование контрастности (STL потоки).

StretchContrastSTL(local_data, local_output, global_min, global_max, num_stl_threads);

Формула преобразования:

новое_значение = ((старое_значение - min) * 255) / (max - min)

Параллельная обработка каждого пикселя.

Используется формула линейной растяжки гистограммы.

Шаг 6: Сбор результатов.

MPI_Gatherv(local_output.data(), local_size, MPI_INT, recv_buffer.data(), ...);

Все процессы отправляют свои обработанные блоки процессу 0

Процесс 0 собирает и объединяет результаты

  1. Пост-обработка (PostProcessingImpl)
    Проверяет, что размер выходных данных соответствует размеру входных.

Особенности реализации

Работает как на одном узле, так и на кластере.

Независимая настройка MPI и STL параллелизма.

Минимизация межпроцессного взаимодействия.

Корректная обработка пустых данных и граничных случаев.

  • Задача: Повышение контраста полутонового изображения посредством линейной растяжки гистограммы
  • Вариант: 28
  • Технология: ALL
  • Описание вашей реализации и отчёта.
    Реализация содержит ALL-версию алгоритма повышения контраста полутонового изображения посредством линейной растяжки гистограммы.

Чек-лист

  • Статус CI: Все CI-задачи (сборка, тесты, генерация отчёта) успешно проходят на моей ветке в моем форке
  • Директория и именование задачи: Я создал директорию с именем klimenko_v_lsh_contrast_incr
  • Полное описание задачи: Я предоставил полное описание задачи в теле pull request
  • clang-format: Мои изменения успешно проходят clang-format локально в моем форке (нет ошибок форматирования)
  • clang-tidy: Мои изменения успешно проходят clang-tidy локально в моем форке (нет предупреждений/ошибок)
  • Функциональные тесты: Все функциональные тесты успешно проходят локально на моей машине
  • Тесты производительности: Все тесты производительности успешно проходят локально на моей машине
  • Ветка: Я работаю в ветке, названной точно так же, как директория моей задачи
    (klimenko_v_lsh_contrast_incr), а не в master
  • Правдивое содержание: Я подтверждаю, что все сведения, указанные в этом pull request, являются точными и
    достоверными

@codecov-commenter
Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 87.50000% with 12 lines in your changes missing coverage. Please review.
✅ Project coverage is 82.28%. Comparing base (f7f3d46) to head (b733a54).

Files with missing lines Patch % Lines
...s/klimenko_v_lsh_contrast_incr/all/src/ops_all.cpp 87.50% 6 Missing and 6 partials ⚠️

❌ Your patch status has failed because the patch coverage (87.50%) is below the target coverage (95.00%). You can increase the patch coverage or adjust the target coverage.

Additional details and impacted files
@@           Coverage Diff           @@
##           master     #564   +/-   ##
=======================================
  Coverage   82.27%   82.28%           
=======================================
  Files         497      498    +1     
  Lines       21191    21287   +96     
  Branches     8691     8739   +48     
=======================================
+ Hits        17434    17515   +81     
- Misses       2614     2621    +7     
- Partials     1143     1151    +8     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants