Skip to content

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

Open
limdizz wants to merge 1 commit intolearning-process:masterfrom
limdizz:klimenko_v_lsh_contrast_incr_omp

Conversation

@limdizz
Copy link
Contributor

@limdizz limdizz commented Mar 2, 2026

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

Алгоритм выполняет линейное растяжение гистограммы изображения (контрастирование) путем масштабирования значений яркости пикселей из исходного диапазона в полный диапазон [0, 255].

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

  1. Валидация (ValidationImpl)
    Проверяет, что входные данные не пустые.

  2. Предварительная обработка (PreProcessingImpl)
    Выделяет память под выходные данные того же размера, что и входные.

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

Шаг 1: Параллельный поиск минимального и максимального значений

int min_val = input[0];
int max_val = input[0];

#pragma omp parallel for default(none) shared(input, size) reduction(min : min_val) reduction(max : max_val)
for (size_t i = 0; i < size; ++i) {
  min_val = std::min(input[i], min_val);
  max_val = std::max(input[i], max_val);
}

Используется OpenMP редукция для параллельного поиска

Каждый поток обрабатывает свою часть данных

Результаты объединяются с помощью операций min и max

Шаг 2: Обработка частного случая

if (max_val == min_val) {
#pragma omp parallel for default(none) shared(input, output, size)
for (size_t i = 0; i < size; ++i) {
  output[i] = input[i];
}
return true;

}

Если все пиксели имеют одинаковую яркость, выходное изображение копируется из входного (параллельно)

Шаг 3: Параллельное преобразование каждого пикселя

const int range = max_val - min_val;
#pragma omp parallel for default(none) shared(input, output, size, min_val, range)
for (size_t i = 0; i < size; ++i) {
  output[i] = ((input[i] - min_val) * 255) / range;
}
return true;

Каждый пиксель обрабатывается независимо в параллельном цикле

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

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

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

Эффективная обработка больших изображений.

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

Минимизация накладных расходов на синхронизацию.

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

Чек-лист

  • Статус 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, являются точными и
    достоверными

@limdizz limdizz requested a review from allnes as a code owner March 2, 2026 21:07
@limdizz limdizz closed this Mar 3, 2026
@limdizz limdizz force-pushed the klimenko_v_lsh_contrast_incr_omp branch from bbee0a0 to 405caad Compare March 3, 2026 17:48
@limdizz limdizz reopened this Mar 3, 2026
@limdizz limdizz closed this Mar 3, 2026
@limdizz limdizz force-pushed the klimenko_v_lsh_contrast_incr_omp branch from ad5b4a9 to 405caad Compare March 3, 2026 18:07
@limdizz limdizz reopened this Mar 3, 2026
@limdizz limdizz closed this Mar 3, 2026
@limdizz limdizz force-pushed the klimenko_v_lsh_contrast_incr_omp branch from 36a0d97 to 405caad Compare March 3, 2026 18:33
@limdizz limdizz reopened this Mar 3, 2026
@limdizz
Copy link
Contributor Author

limdizz commented Mar 4, 2026

Данный пул реквест включает в себя папку klimenko_v_lsh_contrast_incr_seq. Я делал фикс-пулреквест, который переименовывал её в klimenko_v_lsh_contrast_incr, в соответствующей ветке. В данной же ветке при попытке переименования/удаления klimenko_v_lsh_contrast_incr_seq и пуша изменений падают тесты clang-tidy у чужих работ на моей, и текст ошибки гласит, что не хватает объявления klimenko_v_lsh_contrast_incr_seq. Могу попробовать снова и сделать скриншот, если необходимо, однако хотел бы задать вопрос, можете ли вы убрать директорию klimenko_v_lsh_contrast_incr_seq на этапе мёржа, оставив только klimenko_v_lsh_contrast_incr?

Ramzan8-88 pushed a commit to Ramzan8-88/ppc-2026-threads that referenced this pull request Mar 4, 2026
…а - разбиение только матрицы А - умножение матрицы на матрицу. Вариант 13 (learning-process#229)

## Описание
- **Задача**: Ленточная горизонтальная схема - разбиение только матрицы
А - умножение матрицы на матрицу
- **Вариант**: 13
- **Технология**: SEQ | MPI

### Цель работы
Разработка параллельной MPI-реализации алгоритма умножения матриц с
использованием ленточной горизонтальной схемы разбиения, при которой
распределяется только матрица A, а матрица B полностью доступна всем
процессам, и сравнительный анализ её производительности с
последовательной версией при различном количестве процессов.

### Базовый алгоритм (последовательная версия)
**Входные данные:** две матрицы `A (N × M)` и `B (M × K)`, где размеры
матрицы записаны в виде `(<число строк> × <число столбцов>)`.

**Выходные данные:** матрица `C (N × K)`, где размеры матрицы записаны в
виде `(<число строк> × <число столбцов>)`.

**Алгоритм последовательной реализации:**
1. Сохранить исходные размеры матриц.
2. Преобразовать матрицу `A` в одномерный массив построчно.
3. Построить транспонированную матрицу `B` и преобразовать её в
одномерный массив построчно.
4. Вычислить скалярное произведение каждой строки `i` (от `0` до `N-1`)
матрицы `A` с каждым столбцом `j` (от `0` до `K-1`) матрицы `B` и
записать в элемент `C[i][j]` результирующей матрицы `C`.

**Сложность алгоритма:** `O(N×M×K)`, где `(N × M)` и `(M × K)` – размеры
матриц `A` и `B` соответственно.

### Схема распараллеливания
Параллельная версия реализует ленточную горизонтальную схему: матрица
`A` делится на блоки строк и распределяется между процессами, матрица
`B` передаётся целиком на все процессы.
- **Инициализация:** Все процессы работают в `MPI_COMM_WORLD`. Процесс 0
владеет входными данными.
- **Рассылка общих данных:** Процесс 0 рассылает исходные размеры матриц
и транспонированную матрицу `B` с помощью операции `MPI_Bcast`.
- **Распределение матрицы A:** Процесс 0 распределяет строки матрицы `A`
между всеми процессами с помощью операции `MPI_Scatterv` с балансировкой
нагрузки – первые `remainder` процессов получают одну дополнительную
строку при неравномерном делении.
- **Локальные вычисления:** Каждый процесс вычисляет свой блок строк
результирующей матрицы `C` с использованием скалярных произведений.
- **Агрегация результата:** Результирующая матрица `C` собирается на
всех процессах в виде одномерного массива с помощью операции
`MPI_Allgatherv`.
- **Формирование итога:** Результирующая матрица `C` восстанавливается
из одномерного массива.

### Структура отчёта
1. **Введение** – актуальность задачи и цели работы.
2. **Постановка задачи** – формальное определение алгоритма и
ограничения.
3. **Базовый алгоритм** – описание последовательной реализации.
4. **Схема распараллеливания** – архитектура параллельной версии.
5. **Детали реализации** – организация проекта и основные компоненты.
6. **Тестовая инфраструктура** – конфигурация оборудования и методика
тестирования.
7. **Результаты и обсуждение** – проверка корректности работы и анализ
производительности.
8. **Выводы** – основные итоги работы.
9. **Источники** – использованные источники.

### Основные результаты
- **Корректность:** Успешно пройдены 16 функциональных тестов с
покрытием граничных случаев.
- **Производительность:** MPI-реализация демонстрирует ускорение
относительно последовательной версии 1.66x на 2 процессах и 2.17x на 4
процессах.
-  **Эффективность:** 83% на 2 процессах, 54% на 4 процессах.

## Чек-лист
- [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, являются точными и достоверными
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.

1 participant