Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
фильтр Гаусса OpenCL.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
1.3 Mб
Скачать

2.3 Применение технологии OpenCl к рекурсивному фильтру

Так как само приложение написано с помощью универсального фреймворка Qt, то, для использования OpenCL, была взята экспериментальная разработка QtOpenCL (апрель 2010), которая берёт на себя все вопросы, связанные с менеджментом ядер OpenCL, что даёт огромное удобство при реализации.

Устройство хоста в нашем случае будет вычислять только необходимые константы, настраивать окружение OpenCL и инициировать выполнение программного кода в среде GPU (или CPU).

И так, наш алгоритм состоит из четырёх этапов, каждая пара которых между собой идентична. Сперва, мы для каждой строки изображения применяем рекурсивный фильтр Гаусса, это делает для всех трёх цветовых компонент. Не трудно заметить, что будет присутствовать два цикла, поэтому мы можем выделить часть кода клиента, который будет выполняться на одном из нескольких ядер GPU. Затем транспонируем наше изображение и применяем код клиента, выделенного раньше (но в данном случае это будет код для столбцов, а не строк). И затем обратно транспонируем изображение.

Код клиента будет содержать все необходимые вычисления для расчёта текущей точки. Так как параллельно будет запущено несколько ядер (N штук), то общие вычисления будут в N раз быстрее. Это позволяет добиться огромного прироста производительности.

3. Сравнительный анализ, условия тестирования, результаты

На практике я использовал release-сборку программы. Время измерялось только в период выполнения операций фильтрования. Операции загрузки изображений, преобразований их во внутренний формат, расчёт первоначальных констант – это время не учитывалось.

Одна очень важная особенность техники GPGPU состоит в том, что программа хоста, позволяет компилировать код клиента в момент выполнения программы и оптимизировать его в зависимости от системы и оборудования. Это очень важно, так например, не имея подходящего GPU, клиент может выполняться на CPU, но также распараллелено. В моём случае, при тестировании не удалось найти подходящий компьютер с новейшими GPU, но можно утверждать, что код, выполненный на CPU, будет значительно быстрее работать на GPU.

Итак, условия тестирования включают в себя:

  • Процессор Intel Core 2 T7200 CPU @ 2.00 Ghz

  • Оперативная память 2.00 Gb RAM

  • Операционаня система Microsoft Windows XP Service Pack 3

  • Видеокарта ATI Mobility Radeon X1600

Исходное 32ух-битное изображение использовалось следующих размеров (в пикселях):

  • 256х256

  • 512х512

  • 1024х1024

  • 2048х2048

  • 4096х4096

Для разрешения 256х256 имеем следующие тесты (все результаты в миллисекундах):

  • Явный метод: 78, 63, 79

  • С помощью FFT: 3859, 3965, 3842

  • Рекурсивный: 47, 47, 32

  • OpenCL: 15, 15, 15

Для изображения 512х512:

  • Явный метод: 219, 218, 219

  • С помощью FFT: 40015, 41134, 40187

  • Рекурсивный: 172, 172, 157

  • OpenCL: 47, 32, 31

Для изображения 1024х1024:

  • Явный метод: 750, 765, 766

  • С помощью FFT: 592422, 587886, 591135

  • Рекурсивный: 454, 469, 454

  • OpenCL: 141, 140, 141

Как видим, фильтрация с помощью преобразования Фурье увеличивает время выполнения программы более чем в 10 раз, при увеличении изображения вдвое. Поэтому в дальнейшем я решил исключить данный тип фильтрации как крайне неэффективный в данной реализации. Для изображения 2048х2048:

  • Явный метод: 2969, 2984, 2985

  • Рекурсивный: 1782, 1781, 1781

  • OpenCL: 703, 703, 703

Для изображения 4096х4096:

  • Явный метод: 11922, 11937, 11954

  • Рекурсивный: 6174, 6159, 6160

  • OpenCL: 3109, 3094, 3172

Так же покажем совместную диаграмму для всех типов изображения:

И для наглядности, без преобразования Фурье:

Само исходное изображение и результат работы фильтра: