
- •Министерство образования республики беларусь белорусский госудастрвенный университет Факультет прикладной математики и информатики
- •Минск 2010 аннотация
- •Анатацыя
- •Реферат
- •Введение
- •1. Фильтры
- •1.1 Фильтр Гаусса
- •1.2 Базовый случай фильтра Гаусса
- •1.3 Применение фильтра Гаусса с помощью преобразования Фурье
- •1.3.1 Дискретное преобразование Фурье
- •1.3.2 Быстрое преобразование Фурье
- •1.4 Рекурсивный фильтр Гаусса
- •2. Методы параллелизации. OpenCl
- •2.1 Выбор платформы
- •2.3 Применение технологии OpenCl к рекурсивному фильтру
- •3. Сравнительный анализ, условия тестирования, результаты
- •4. Выводы
- •Заключение
- •Список использованных источников
- •Приложение а. Руководство пользователя
- •Приложение б. Листинг программы
4. Выводы
Какие же можно сделать выводы? Первое, что хочется отметить – это явное отставание с помощью фильтрации с применением преобразования Фурье.
Вопреки ожиданиям, этот метод показал себя крайне неэффективно и заочно выбыл из испытаний. Как такое могло случиться? Возможно, это связано с огромным количеством циклических операций сложения в реализации метода. Так же может повлиять постоянная адресация в различные сегменты памяти ОЗУ, где влияет уже латентность(memory latency) самого физического устройства. Возможно, из-за этой задержки сказывается такое поведение.
Так же в этой реализации присутствуют множество операций с плавающей точкой. Хотя современные процессоры научились хорошо работать в этом режиме – но в совокупности факторов это могло повлиять. Я так же проводил тесты, задавая указание компилятору, внутренне представлять числа с плавающей точкой в виде фиксированной. Но данный метод не сильно оправдал себя. По результатам исследования я получил не более 6% прироста производительности (~6400 миллисекунд против ~6000). В качестве вывода для этого метода можно предположить следующее: без соответствующей хорошей реализации самого преобразования Фурье мы будем худшую производительность за счёт огромного количества проходов в циклах, где осуществляются операции с плавающей точкой и неструктурные запросы в оперативную память.
Явный метод показал себя, как и следовало ожидать, не в первых местах. Однако в данном исследовании не на последнем месте. Здесь сказывается большое количество операций - M*N*D*D, где М – изображение в ширину, N – изображение в высоту, D – размер окна. Как видим, здесь каких либо оптимизаций сделать не удастся, разве что за счёт уменьшения размера окна. Но вопрос, зачем, если это уменьшает эффективность самого фильтра.
Намного лучше предыдущих показал себя рекурсивный фильтр Гаусса. Здесь мы видим скорость и эффективность недоступную вышеописанным претендентам. Хотя он и имеет сложность M*N*4, за счёт прохождения по строкам изображения, по столбцам и дважды транспонирования, но показал сея как вполне эффективный фильтр, который уже можно применять в прикладных программах. Что можно улучшить в данном фильтре – так это избавиться от транспонирования, что даст небольшой, но всё же прирост производительности.
И наконец, наиболее эффективный алгоритм нашего исследования – рекурсивный фильтр Гаусса с использованием параллелизации на GPU и CPU средствами OpenCL. Данный метод показал себя лучше всех даже на тестовом двуядерном CPU. В некоторых тестах его производительность была более чем в три раза выше ближайшего конкурента. А это очень много. Как можно улучшить данный метод? Со стороны алгоритма, как и в рекурсивном случае, избавиться от транспонирования, а со стороны аппаратного обеспечения –повысить количество рабочих ядер. OpenCL позволяет задействовать все имеющиеся в наличии ресурсы компьютера, как GPU, так и CPU, поэтому, как говорится, чем больше – тем лучше. И данный метод уже может применяться на больших объёмах данных с использованием мощных кластеров.