Skip to content

VladimirKhmelev/Image-Convolution

Repository files navigation

Image Convolution

Реализует свёртку с 6 фильтрами, 4 стратегиями CPU-параллелизации и GPU-ускорением через OpenCL (JOCL).

Быстрый старт

# GUI
./gradlew run

# CLI — применить фильтр
./gradlew run --args='photo.png "Gaussian Blur 3×3" --strategy rows --output result.png'

# CLI — цепочка фильтров
./gradlew run --args='photo.png "Gaussian Blur 3×3" "Sharpen 3×3" --strategy rows --threads 4 --output result.png'

# CLI — бенчмарк всех стратегий
./gradlew run --args='photo.png --benchmark'

# CLI — пайплайн (пакетная обработка директории)
./gradlew run --args='/path/to/images/ "Gaussian Blur 3×3" --pipeline --workers 4 --output results/'

# CLI — гибридный пайплайн (1 GPU-воркер + 3 CPU-воркера)
./gradlew run --args='/path/to/images/ "Gaussian Blur 3×3" --pipeline --workers 4 --gpu-workers 1 --output results/'

# CLI — бенчмарк пайплайна
./gradlew run --args='photo.png "Gaussian Blur 3×3" --pipeline --benchmark --batch-size 32'

Все флаги CLI описаны в DOCS.md. Структура пакетов и архитектура — там же, в разделе «Архитектура проекта».

Тесты

./gradlew test

Отчёты: build/reports/tests/test/index.html и build/reports/jacoco/test/html/index.html

Фильтры

24 фильтра четырёх размеров. Каждый размер содержит одинаковый набор типов:

Размер Оп/пиксель Фильтры
3×3 9 Identity, Box Blur, Gaussian Blur, Sharpen, Edges, Emboss
5×5 25 то же самое
7×7 49 то же самое
9×9 81 то же самое

Стратегии параллелизации (одно изображение)

Ключ Описание
seq Последовательный
gpu GPU-свёртка через OpenCL (JOCL)
pixels По пикселям
rows По строкам
cols По столбцам
grid По сетке (2D, настраиваемая)

Пайплайн (пакетная обработка)

Режим --pipeline обрабатывает массив изображений потоком: ридер → N воркеров → врайтер.

Поддерживается гибридный режим (--gpu-workers K): K воркеров из N используют GPU, остальные N−K работают на CPU — GPU и CPU обрабатывают разные изображения параллельно. GPU-вызовы сериализованы — см. раздел «Тестовое окружение».

Подробнее — DOCS.md.

Тестовое окружение

Компонент Характеристика
CPU Intel Core i5-12450H, 8 ядер / 12 потоков, до 4.4 ГГц
RAM 16 ГБ
GPU Intel UHD Graphics (интегрированная, OpenCL)
ОС Linux 6.17.0-20-generic
JVM 21

Ограничение GPU: свёртка на GPU реализована (задание 4a/4b), но параллельные вызовы OpenCL сериализованы через синглтон GpuContext — одновременно на GPU работает не более одного потока. Несколько параллельных свёрток на одной GPU (задание 4d) не реализовано, поэтому при нескольких GPU-воркерах реального ускорения не будет.

Производительность

Бенчмарк: Gaussian Blur 3×3, n=30 замеров, фильтр --benchmark. Исходники в benchmark_images/, сырые данные в benchmark_data/, все графики с разбором — plots/README.md.

Общая картина (все размеры)

overall

128×128 — оверхед корутин

На маленьком изображении CPU-параллелизм медленнее последовательного: стоимость запуска корутин превышает сам объём работы. GPU и сетка успевают быстрее за счёт иной схемы запуска.

128x128

7071×7071 — кэш-эффект и GPU

На большом изображении «По столбцам» (~961 мс) почти не уступает последовательному (~1138 мс): итерация по столбцу даёт промах кэша на каждом шаге (stride = ширина строки). GPU (1 воркер, без параллелизма на устройстве) — ~196 мс, лучший результат.

7071x7071

Технологии

  • Язык: Kotlin 2.1.0
  • JVM: 21
  • Сборка: Gradle 8.x
  • GPU: JOCL (Java Bindings for OpenCL)
  • Тестирование: JUnit 5, JaCoCo

Лицензия

Этот проект распространяется под лицензией MIT. Подробности см. в файле LICENSE.

About

Parallel image processing with various filters, comparing the efficiency of different parallelization strategies

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors