Реализует свёртку с 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.
На маленьком изображении CPU-параллелизм медленнее последовательного: стоимость запуска корутин превышает сам объём работы. GPU и сетка успевают быстрее за счёт иной схемы запуска.
На большом изображении «По столбцам» (~961 мс) почти не уступает последовательному (~1138 мс): итерация по столбцу даёт промах кэша на каждом шаге (stride = ширина строки). GPU (1 воркер, без параллелизма на устройстве) — ~196 мс, лучший результат.
- Язык: Kotlin 2.1.0
- JVM: 21
- Сборка: Gradle 8.x
- GPU: JOCL (Java Bindings for OpenCL)
- Тестирование: JUnit 5, JaCoCo
Этот проект распространяется под лицензией MIT. Подробности см. в файле LICENSE.


