Upload
others
View
21
Download
0
Embed Size (px)
Citation preview
Нижегородский государственный университет им. Н.И. Лобачевского
Лабораторная работа
Фильтрация изображений. Быстрое
преобразование Фурье
Параллельные численные методы
Сиднев А.А.
Кафедра математического обеспечения ЭВМ
При поддержке компании Intel
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 2
Преобразование Фурье.
Назначение и примеры
использования
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 3
Назначение ПФ
В обработке сигналов и связанных областях
преобразование Фурье обычно рассматривается как
декомпозиция сигнала на частоты и амплитуды, то есть,
обратимый переход от временного пространства (time
domain) в частотное пространство (frequency domain).
Далее рассмотрим примеры:
– обработка изображений;
– обработка звука.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 4
Аудио
В исходном WAV файле, хранится полная информация об
исходном звуке, оцифрованном и проквантованном с
частотой 44кГц.
Этой информации абсолютно достаточно для
воспроизведения всех частот исходного сигнала, меньших
половины частоты квантования (по т. Котельникова).
!!! Одна минута записи занимает около 15 МБ.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 5
Сжатие MP3
MPEG Layer-3.
Исходный звуковой файл режется на фрагменты,
длительностью по 50 миллисекунд, каждый из которых
анализируется отдельно.
При анализе фрагмент раскладывается на гармоники по
методу Фурье, из которых в соответствии с теорией
восприятия звука человеческим ухом выбрасываются те
гармоники, которые человек хуже воспринимает на фоне
остальных:
– более тихие гармоники на фоне более громких;
– звуки, замаскированные вследствие инертности слуха.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 6
Воспроизведение MP3
При воспроизведении производится обратное
преобразование, при котором оставшиеся гармоники
вновь преобразуются в звуковую волну.
Поскольку часть информации об исходном сигнале была
выкинута, звук получается не совпадающий с исходным.
Битрейт - это объем информации в единицу времени, как
много информации можно потратить на каждую секунду
записи:
– чем он меньше, тем меньший размер имеют файлы с
одинаковой по времени длине;
– чем он меньше, тем большее количество "лишних"
гармоник приходится выкидывать.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 7
Пример фильтрации изображения низкого качества
Фильтрация изображений
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 8
Цифровая обработка изображений
Фильтрация
– Пространственная
• Линейный фильтр
• Медианный фильтр
• Изотропный фильтр
– Частотная
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 9
Пространственная фильтрация
Процесс фильтрации основан на простом перемещении
маски фильтра от точки к точке изображения.
В каждой точке отклик фильтра вычисляется с
использованием предварительно заданных связей.
Пространственные фильтры имеют линейную
трудоѐмкость.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 10
Частотная фильтрация
Все пространственные фильтры можно реализовать с
помощью частотных.
Фильтрация происходит в частотной области
изображения.
С помощью преобразования Фурье происходит получение
частотной области (спектра) изображения.
Простая идея фильтрации:
– низкие частоты – плавное изменение яркости
изображения;
– высокие частоты – быстрое изменение яркости
изображения (границы объектов).
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 11
Пример частотного спектра
Изображение Фурье-спектр
Логарифмический
спектр
Фильтрация изображений. Быстрое преобразование Фурье 12 Н.Новгород, 2011 г.
Разминка
0. Задание на знание синтаксиса языка C
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 13
Все проекты разработаны в среде Microsoft Visual Studio
2008.
Для работы программы необходима библиотека OpenCV.
Для обработки видеофрагментов потребуется кодек Xvid.
Программное обеспечение
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 14
– <OpenCV install dir>\cxcore\include\
– <OpenCV install dir>\otherlibs\highgui\
– <OpenCV install dir>\lib
Настройка среды разработки
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 15
Компилятор вам поможет.
Ошибки в программе
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 16
Отсутствует ―using namespace std;‖ (filter.cpp:14, fft.h:6).
Ошибки компиляции (1)
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 17
Ошибки компиляции (2)
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 18
Ошибки компиляции (2)
2 - отсутствует ―;‖ (filter.cpp:50).
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 19
Ошибки компиляции (2)
2 - отсутствует ―;‖ (filter.cpp:50).
3 - опечатка в функции pnintf (filter.cpp:334).
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 20
Ошибки компиляции (2)
2 - отсутствует ―;‖ (filter.cpp:50).
3 - опечатка в функции pnintf (filter.cpp:334).
7 - не объявлена переменная, хранящая количество
обработанных кадров (filter.cpp:275):
int totFrames = 0;
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 21
Ошибки компиляции (3)
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 22
Ошибки компиляции (3)
4 - неверный тип аргумента функции cvReleaseImage -
отсутствует ―&‖ (filter.cpp:467).
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 23
Ошибки компиляции (3)
4 - неверный тип аргумента функции cvReleaseImage -
отсутствует ―&‖ (filter.cpp:467).
2 - неверная передача параметров в функцию printf
(filter.cpp:384).
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 24
Ошибки компиляции (3)
4 - неверный тип аргумента функции cvReleaseImage -
отсутствует ―&‖ (filter.cpp:467).
2 - неверная передача параметров в функцию printf
(filter.cpp:384).
5 - отсутствует ―}‖, закрывающая тело цикла
(filter.cpp:317).
Фильтрация изображений. Быстрое преобразование Фурье 25 Н.Новгород, 2011 г.
Ещѐ раз вспомним C
1. Задание на простые алгоритмические ошибки в программах
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 26
Ошибки в программе
Программа запустилась. Теперь необходимо заставить
работать программу корректно!!!
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 27
Запуск Intel Inspector XE
Режим работы ―Quick: Memory Error Analysis / Locate
Memory Problems‖
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 28
Intel Inspector XE. Утечки памяти
Обнаружена 41 утечка памяти!
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 29
Ошибки (1)
Не освобождается ресурс ―film‖ перед завершением
работы программы (filter.cpp:465):
cvReleaseCapture(&film);
Не закрывается открытый файл (filter.cpp:329):
fclose(f);
Не уничтожается одно из окон перед завершением
работы программы (filter.cpp:256):
cvDestroyWindow(fStr);
Не освобождаются ресурсы картинки (filter.cpp:467):
cvReleaseImage(&filter);
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 30
Результат запуска программы
1. Отрицательные
времена
2. Некорректное изображение
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 31
Ошибки (2)
Неправильное вычитание (filter.cpp:426):
(finish.QuadPart-start.QuadPart)
Не выполняется передача параметра при рекурсивном
вызове (fft.cpp:44):
SerialFFTCalculation( signal, first, size/2, forward);
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 32
Низкочастотная фильтрация
filter.exe ..\Videos\TestVideo1.avi –gl
Корректная работа программы (1)
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 33
Высокочастотная фильтрация
filter.exe ..\Videos\TestVideo1.avi –gh
Корректная работа программы (2)
Фильтрация изображений. Быстрое преобразование Фурье 34 Н.Новгород, 2011 г.
Профилировка
2. Анализ эффективности программного обеспечения можно
выполнять ничего не зная о решаемой задаче, используя
профилировщики.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 35
Оценка эффективности
Время, потраченное на обработку видео: 128.5 с
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 36
Профилировка
Итак, программа работает очень медленно и нам
предстоит с ней разобраться! Для этого необходимо
определить наиболее ―горячие‖ точки программы –
локализовать задачу.
Для поиска горячих точек необходимо воспользоваться
профилировщиком:
– Intel Parallel Amplifier;
– Intel VTune Amplifier XE;
– Profiler (VS 2008, VS 2010);
– gprof.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 37
Использование Intel VTune Amplifier XE
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 38
“Горячие” точки
Функция вычисления БПФ является самой ―горячей‖.
Если получится выполнить оптимизацию этой функции, то
получим максимальный выигрыш!
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 39
Анализ профиля (1)
Самая ―горячая‖ функция SerialFFTCalculation вызывает в
цикле функцию Butterfly.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 40
Анализ профиля (2)
Функция Butterfly выполняет простейшие действия, но за
счѐт большого количества вызовов является самым узким
местом в программе.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 41
Использование массивов вместо контейнера
std:vector
Реализации контейнеров STL достаточно медленные.
Компилятор генерирует наиболее эффективный код при
использовании простых типов данных.
Откажемся от использования std::vector – будем
использовать обычные массивы.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 42
Не эффективное использование контейнера
std::vector (1)
Передача контейнеров по значению.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 43
Не эффективное использование контейнера
std::vector (2)
Неэффективное заполнение контейнера.
Фильтрация изображений. Быстрое преобразование Фурье 44 Н.Новгород, 2011 г.
STL и HPC не всегда
совместимы!
3. STL-реализации контейнеров не самые быстрые. Их основное
достоинство в унификации.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 45
Оценка эффективности
Время, потраченное на обработку видео: 120.8 с
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 46
Прогресс оптимизации
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 47
Ищем ошибки
А программа-то была с ошибками!
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 48
Ошибки работы с динамической памятью (1)
Не освобождается память, выделенная под динамический
массив (filter.cpp:213):
delete[] outB;
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 49
Ошибки работы с динамической памятью (2)
Освобождение памяти не соответствует выделению
(filter.cpp:217):
delete[] f;
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 50
Intel С++ Compiler
Далее поступим самым простым образом: воспользуемся
оптимизирующим компилятором Intel.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 51
Использование Intel Compiler
Конвертирование проекта:
Фильтрация изображений. Быстрое преобразование Фурье 52 Н.Новгород, 2011 г.
Intel Power
4. Современные компиляторы в состоянии генерировать
высокоэффективные программы. Разработчику достаточно лишь
написать понятный для компилятора программный код.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 53
Оценка эффективности
Время, потраченное на обработку видео: 85.6 с
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 54
Прогресс оптимизации
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 55
Ищѐм следующее проблемное место
―– Что дальше?
– Снова профилировка и поиск ―горячих‖ точек!‖
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 56
Самая “медленная” функция
Большую часть времени выполняется функция SerialFFTCalculation.
Функция Butterfly исчезла из профиля, т.к. компилятор встроил еѐ код
непосредственно в функцию SerialFFTCalculation.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 57
Анализ профиля
22.6% времени работы программы занимает выполнение
функции по смещению 0x4748.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 58
Тригонометрические функции
Функция по смещению 0x4748 выполняет вычисление
тригонометрических функций sin и cos. Посчитанные
значения передаются в параметры функции Butterfly.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 59
Преобразование Фурье
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 60
Преобразование Фурье
ПФ широко применяется в задачах анализа спектра
сигнала, цифровой обработки сигналов и др.
Существуют специализированные процессоры для
вычисления дискретного преобразования Фурье
(DSP-процессоры).
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 61
Аппаратная реализация БПФ
Однокристальная реализация алгоритма БПФ на ПЛИС
фирмы Xilinx
Профессиональная видеокамера со встроенным
видеопроцессором Altera Stratix II GX
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 62
Комплексное число
Тригонометрическая форма записи
Показательная форма записи
Комплексные числа
𝑧 = 𝑥 + 𝑖 ⋅ 𝑦, где
𝑥, 𝑦 - вещественные числа, 𝑖 – мнимая единица (𝑖2 = −1).
𝑧 = 𝑟 ⋅ (𝑐𝑜𝑠𝜑 + 𝑖 ⋅ 𝑠𝑖𝑛𝜑)
𝑟 = 𝑧 , 𝑐𝑜𝑠𝜑 =𝑥
|𝑧|, 𝑠𝑖𝑛𝜑 =
𝑦
|𝑧|
𝑧 = 𝑟 ⋅ 𝑒𝑖⋅𝜑 = 𝑟 ⋅ (𝑐𝑜𝑠𝜑 + 𝑖 ⋅ 𝑠𝑖𝑛𝜑)
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 63
Преобразование Фурье
Любая функция, периодически воспроизводящая свои
значения, может быть представлена в виде суммы
синусов или косинусов различных частот, умноженных на
некоторые коэффициенты.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 64
Разложение функции на гармоники
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 65
Спектр сигнала (1)
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 66
Спектр сигнала (2)
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 67
Преобразование Фурье (2)
Прямое преобразование Фурье:
Обратное преобразование Фурье:
- исходный сигнал (комплексный)
- спектр сигнала (комплексный)
𝑦(𝜔) = 𝑥(𝑡) ⋅ 𝑒;𝜔⋅𝑡⋅𝑖 𝑑𝑡
:∞
;∞
x(𝑡) =1
2𝜋 𝑦(𝜔) ⋅ 𝑒𝜔⋅𝑡⋅𝑖𝑑𝜔
:∞
;∞
x(𝑡)
y(𝜔)
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 68
Дискретизация сигнала
Рассмотрим функцию :
где - дельта-функция.
𝑥𝜎 𝑡 = 𝑥 𝑡 𝜎 𝑡 − 𝑛 ⋅△ 𝑡
𝑁;1
𝑛<0
= 𝑥(𝑡) ⋅ 𝜎 𝑡 − 𝑛 ⋅△ 𝑡
𝑁;1
𝑛<0
𝜎 𝑡
𝑥𝜎 𝑡
𝜎 𝑡 = ∞ , если 𝑡 = 0
𝜎 𝑡 = 0, если 𝑡 ≠ 0
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 69
Связь непрерывного и дискретного
преобразований
Вычислим спектр дискретного сигнала:
Можно рассматривать только один период повторения
спектра при .
𝑦 𝜔 = 𝑥𝜎(𝑡) ⋅ 𝑒;𝜔⋅𝑡⋅𝑖
∞
;∞
𝑑𝑡 = 𝑥(𝑡) ⋅ 𝜎 𝑡 − 𝑛 ⋅△ 𝑡
𝑁;1
𝑛<0
⋅ 𝑒;𝜔⋅𝑡⋅𝑖∞
;∞
𝑑𝑡
𝑦 𝜔 = 𝑥 𝑡 ⋅ 𝜎 𝑡 − 𝑛 ⋅△ 𝑡
∞
;∞
⋅ 𝑒;𝜔⋅𝑡⋅𝑖 𝑑𝑡
𝑁;1
𝑛<0
= 𝑥 𝑛 ⋅△ 𝑡 ⋅ 𝑒;𝜔⋅𝑛⋅△𝑡⋅𝑖𝑁;1
𝑛<0
𝑥(𝑡) ⋅ 𝜎 𝑡 − 𝜏
∞
;∞
𝑑𝑡 = 𝑥(𝜏)
𝑦 𝜔 𝜔 ∈ [0,2𝜋
∆𝑡]
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 70
Дискретное преобразование Фурье
Дискретное преобразование Фурье (ДПФ, DFT) – это
разложение дискретной функций на гармонические
составляющие.
Вычисление ДПФ чаще всего происходит в виде быстрого
преобразования Фурье (БПФ, FFT).
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 71
Дискретное преобразование Фурье (2)
- дискретное преобразование
Фурье (ДПФ)
Трудоѐмкость:
𝑥(𝑡) - комплексная функция действительного аргумента
𝑥𝑛 = 𝑥 𝑛 , 𝑛 = 0,𝑁 − 1
𝑦𝑘 = 𝑥𝑛 ⋅ 𝑒;𝑘⋅𝑛𝑁 ⋅2⋅𝜋⋅𝑖
𝑁;1
𝑛<0
, 𝑘 = 0,𝑁 − 1
𝑦𝑘 = 𝑥𝑛 ⋅ (cos𝑘 ⋅ 𝑛
𝑁⋅ 2 ⋅ 𝜋 − 𝑖 ⋅ sin
𝑘 ⋅ 𝑛
𝑁⋅ 2 ⋅ 𝜋 )
𝑁;1
𝑛<0
, 𝑘 = 0,𝑁 − 1
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 72
Дискретное преобразование Фурье (3)
- дискретное преобразование
Фурье (ДПФ)
Трудоѐмкость:
𝑥(𝑡) - комплексная функция действительного аргумента
𝑥𝑛 = 𝑥 𝑛 , 𝑛 = 0,𝑁 − 1
𝑦𝑘 = 𝑥𝑛 ⋅ 𝑒;𝑘⋅𝑛𝑁 ⋅2⋅𝜋⋅𝑖
𝑁;1
𝑛<0
, 𝑘 = 0,𝑁 − 1
𝑦𝑘 = 𝑥𝑛 ⋅ (cos𝑘 ⋅ 𝑛
𝑁⋅ 2 ⋅ 𝜋 − 𝑖 ⋅ sin
𝑘 ⋅ 𝑛
𝑁⋅ 2 ⋅ 𝜋 )
𝑁;1
𝑛<0
, 𝑘 = 0,𝑁 − 1
𝑂(𝑛2)
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 73
Прямое и обратное преобразование Фурье
По заданному образу можно восстановить исходную
функцию с помощью обратного ДПФ
- обратное дискретное
преобразование Фурье (ДПФ)
Трудоѐмкость:
- прямое дискретное
преобразование Фурье (ДПФ)
Трудоѐмкость:
𝑦𝑘 = 𝑥𝑛 ⋅ 𝑒;𝑘⋅𝑛𝑁⋅2⋅𝜋⋅𝑖
𝑁;1
𝑛<0
, 𝑘 = 0,𝑁 − 1
𝑂(𝑛2)
𝑂(𝑛2)
𝑥𝑘 =1
𝑁⋅ 𝑦𝑛 ⋅ 𝑒
𝑘⋅𝑛𝑁 ⋅2⋅𝜋⋅𝑖
𝑁;1
𝑛<0
, 𝑘 = 0,𝑁 − 1
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 74
Быстрое преобразование Фурье (1)
Пусть N – чѐтное, тогда
Чѐтные слагаемые Нечѐтные слагаемые
Коэффициент
поворота
𝑦𝑘 = 𝑥𝑛 ⋅ 𝑒;𝑘⋅𝑛𝑁⋅2⋅𝜋⋅𝑖
𝑁;1
𝑛<0
, 𝑘 = 0,𝑁 − 1
𝑦𝑘 = 𝑥2⋅𝑛 ⋅ 𝑒;2⋅𝑛⋅𝑘𝑁 ⋅2⋅𝜋⋅𝑖
𝑁/2;1
𝑛<0
+ 𝑥2⋅𝑛:1 ⋅ 𝑒;(2⋅𝑛:1)⋅𝑘𝑁 ⋅2⋅𝜋⋅𝑖
𝑁/2;1
𝑛<0
=
= 𝑥2⋅𝑛 ⋅ 𝑒;𝑛⋅𝑘𝑁/2⋅2⋅𝜋⋅𝑖
𝑁/2;1
𝑛<0
+ ( 𝑥2⋅𝑛:1 ⋅ 𝑒;𝑛⋅𝑘𝑁/2⋅2⋅𝜋⋅𝑖
𝑁/2;1
𝑛<0
) ⋅ 𝑒;𝑘𝑁⋅2⋅𝜋⋅𝑖
ДПФ над чѐтными
слагаемыми
ДПФ над нечѐтными
слагаемыми
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 75
Быстрое преобразование Фурье (2)
Пусть t =𝑁
2+ 𝑘, 𝑘 = 0,
𝑁
2− 1
𝑦𝑡 = 𝑥2⋅𝑛 ⋅ 𝑒;𝑛⋅𝑡𝑁/2⋅2⋅𝜋⋅𝑖
𝑁/2;1
𝑛<0
+ ( 𝑥2⋅𝑛:1 ⋅ 𝑒;𝑛⋅𝑡𝑁/2⋅2⋅𝜋⋅𝑖
𝑁/2;1
𝑛<0
) ⋅ 𝑒;𝑡𝑁⋅2⋅𝜋⋅𝑖 =
= 𝑥2⋅𝑛 ⋅ 𝑒;𝑛⋅𝑘𝑁/2⋅2⋅𝜋⋅𝑖⋅ 𝑒;𝑛⋅2⋅𝜋⋅𝑖
𝑁/2;1
𝑛<0
+ ( 𝑥2⋅𝑛:1 ⋅ 𝑒;𝑛⋅𝑘𝑁/2⋅2⋅𝜋⋅𝑖⋅ 𝑒;𝑛⋅2⋅𝜋⋅𝑖
𝑁/2;1
𝑛<0
) ⋅ 𝑒;𝑘𝑁⋅2⋅𝜋⋅𝑖 ⋅ 𝑒;𝜋⋅𝑖 =
= 𝑥2⋅𝑛 ⋅ 𝑒;𝑛⋅𝑘𝑁/2⋅2⋅𝜋⋅𝑖
𝑁/2;1
𝑛<0
− ( 𝑥2⋅𝑛:1 ⋅ 𝑒;𝑛⋅𝑘𝑁/2⋅2⋅𝜋⋅𝑖
𝑁/2;1
𝑛<0
) ⋅ 𝑒;𝑘𝑁⋅2⋅𝜋⋅𝑖
𝑦𝑘′ 𝑦𝑘
′′
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 76
В результате получили:
Быстрое преобразование Фурье (3)
𝑦𝑘′ 𝑦𝑘
′′
𝑦𝑘:𝑁2= 𝑥2⋅𝑛 ⋅ 𝑒
;𝑛⋅𝑘𝑁/2⋅2⋅𝜋⋅𝑖
𝑁/2;1
𝑛<0
− ( 𝑥2⋅𝑛:1 ⋅ 𝑒;𝑛⋅𝑘𝑁/2⋅2⋅𝜋⋅𝑖
𝑁/2;1
𝑛<0
) ⋅ 𝑒;𝑘𝑁⋅2⋅𝜋⋅𝑖
𝑦𝑘 = 𝑥2⋅𝑛 ⋅ 𝑒;𝑛⋅𝑘𝑁/2⋅2⋅𝜋⋅𝑖
𝑁/2;1
𝑛<0
+ ( 𝑥2⋅𝑛:1 ⋅ 𝑒;𝑛⋅𝑘𝑁/2⋅2⋅𝜋⋅𝑖
𝑁/2;1
𝑛<0
) ⋅ 𝑒;𝑘𝑁⋅2⋅𝜋⋅𝑖
𝑦𝑘′ 𝑦𝑘
′′
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 77
БПФ. «Бабочка» (1)
Рекуррентное соотношение «бабочка»
Для вычисления ДПФ над N элементами по соотношению
«бабочки» необходимо вычислить два ДПФ размерности N/2.
- коэффициенты ПФ для
четных элементов
- коэффициенты ПФ для
нечетных элементов
𝑦𝑘 = 𝑦𝑘′ + 𝑦𝑘
′′ ⋅ 𝑒;2⋅𝜋⋅𝑘⋅𝑖𝑁
𝑘 = 0,𝑁
2− 1
𝑦0′, 𝑦1′, … , 𝑦𝑁
2;1′
𝑦0′′, 𝑦1′′, … , 𝑦𝑁
2;1′′
𝑦𝑘:𝑁2= 𝑦𝑘
′ − 𝑦𝑘′′ ⋅ 𝑒;
2⋅𝜋⋅𝑘⋅𝑖𝑁
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 78
БПФ. «Бабочка» (2)
Визуальное представление «бабочки»
𝑦𝑘 = 𝑦𝑘′ + 𝑦𝑘
′′ ⋅ 𝑒;2⋅𝜋⋅𝑘⋅𝑖𝑁
𝑘 = 0,𝑁
2− 1
𝑦𝑘:𝑁2= 𝑦𝑘
′ − 𝑦𝑘′′ ⋅ 𝑒;
2⋅𝜋⋅𝑘⋅𝑖𝑁
𝑦𝑘′
𝑦𝑘′′
𝑦𝑘
𝑦𝑘:𝑁2
𝑈𝑁𝑘 = 𝑒;
2⋅𝜋⋅𝑘⋅𝑖𝑁
𝑈𝑁𝑘
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 79
Быстрое преобразование Фурье
Алгоритм Кули и Таки (Cooley-Tukey)
Основан на рекуррентном соотношении
Трудоѐмкость:
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 80
Быстрое преобразование Фурье
Алгоритм Кули и Таки (Cooley-Tukey)
Основан на рекуррентном соотношении
Трудоѐмкость:
𝑂(𝑛𝑙𝑜𝑔𝑛)
𝑙𝑜𝑔𝑛
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 81
Рассмотрим алгоритм работы БПФ на примере сигнала из
4-х точек, т.е. n=4
К массиву из 4 комплексных чисел
применим «бабочку»
Для простоты в дальнейших вычислениях выполним
перестановку элементов массива (бит-реверсирование)
Пример вычисления 4-точечного БПФ…
ip
pppebay
2
i
p
pppebay
2
1
1,0p
0x 1x2x 3x
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 82
Чтобы посчитать коэффициенты Фурье
необходимо вычислить коэффициенты
Пример вычисления 4-точечного БПФ…
ip
ppp ebay
2
i
p
ppp ebay
21
1,0p
000 bay
002 bay
12
0
i
e
iei
2
1
ibay 111
ibay 113
0p 1p
3210 ,,, yyyy
1010 ,,, bbaa
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 83
Пример вычисления 4-точечного БПФ…
Коэффициенты и являются коэффициентами
преобразования Фурье над сигналами из 2-х точек
(чѐтные и нечѐтные слагаемые)
Для вычисления указанных коэффициентов снова
воспользуемся соотношением «бабочки»
10 ,aa10 ,bb
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 84
Пример вычисления 4-точечного БПФ…
Для 2-точечного сигнала «бабочка»
примет следующий вид для чѐтных слагаемых:
000 baa
001 baa 0p
in
p
ppp ebay2
in
p
pppn ebay2
2/
12
,0 n
p
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 85
Пример вычисления 4-точечного БПФ…
Коэффициенты являются коэффициентами Фурье
для сигнала, состоящего из одной точки:
– для ;
– для .
Коэффициент Фурье для множества из одной точки
является самой точкой, поэтому:
– ;
– .
- коэффициенты Фурье для сигнала, состоящего из
одной точки (нечетные слагаемые):
– ;
– .
00 ,ba
0a0x
0b2x
00 xa
20 xb
0a 0b 0b 0a
00 ,ba
00 xa
20 xb
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 86
Пример вычисления 4-точечного БПФ…
Вычислим коэффициенты 2-точечного БПФ:
Результат запишем в исходный массив:
0a 0b1a 1b
000 baa
001 baa
000 bab
001 bab
0a 0b 0b 0a
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 87
Вычислим искомые коэффициенты (4-точечного БПФ):
Результат запишем в исходный массив:
Пример вычисления 4-точечного БПФ…
000 bay
002 bay
ibay 111
ibay 113
0y1y 2y 3y
0a 0b1a 1b
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 88
Пример вычисления 4-точечного БПФ…
1. Перестановка элементов массива
0x 1x 2x 3x0x 1x2x 3x
Бит-реверсирование
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 89
Пример вычисления 4-точечного БПФ…
2. Выполнение 1-точечного ПФ
0x 1x 2x 3x0x 1x2x 3x
Бит-реверсирование
0a 0b 0b 0a
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 90
Пример вычисления 4-точечного БПФ…
3. Выполнение 2-точечного ПФ
0x 1x 2x 3x
0a 0b 0b 0a
0x 1x2x 3x
Бит-реверсирование
0a 0b1a 1b
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 91
Пример вычисления 4-точечного БПФ…
4. Выполнение 4-точечного ПФ
0y1y 2y 3y
0a 0b1a 1b
0x 1x 2x 3x0x 1x2x 3x
Бит-реверсирование
0a 0b 0b 0a
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 92
Демонстрация вычисления 4-точечного БПФ
0
4U -
+
+
+
0
4U -
+
+
+
0
4U -
+
+
+
2
4U -
+
+
+
2x
0x
1x
3x
1y
0y
2y
3y
1-ый этап 2-ой этап
ki
k nnU e
0 0
4 1U e 2 24
i
U e i
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 93
Демонстрация вычисления 4-точечного БПФ
0
4U -
+
+
+
0
4U -
+
+
+
0
4U -
+
+
+
2
4U -
+
+
+
2x
0x
1x
3x
1y
0y
2y
3y
1-ый этап 2-ой этап
ki
k nnU e
0 0
4 1U e 2 24
i
U e i
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 94
Пример вычисления 8-точечного БПФ…
1. Перестановка элементов массива
Бит-реверсирование
0x 1x 2x 3x 4x 6x5x 7x
0x 2x4x 6x 5x 7x1x 3x
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 95
Пример вычисления 8-точечного БПФ…
2. Выполнение 1-точечного ПФ
1
0a 1
0b 20a 2
0b 30a 3
0b40a 4
0b
0x 2x4x 6x 5x 7x1x 3x
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 96
Пример вычисления 8-точечного БПФ…
3. Выполнение 2-точечного ПФ
0x 2x4x 6x 5x 7x1x 3x
1
0a 1
0b 20a 2
0b 30a 3
0b40a 4
0b
50a 5
0b51a
51b 6
0a 60b6
1a 61b
10
10
50 baa
10
10
51 baa
20
20
50 bab
20
20
51 bab
...
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 97
Пример вычисления 8-точечного БПФ…
4. Выполнение 4-точечного ПФ
0x 2x4x 6x 5x 7x1x 3x
50a 5
0b51a
51b 6
0a 60b6
1a 61b
1
0a 1
0b 20a 2
0b 30a 3
0b40a 4
0b
70a
70b7
1a 71b7
2a 73a 7
3b72b
50
50
70 baa
ibaa 51
51
71
50
50
72 baa
ibaa 51
51
73
60
60
70 bab
ibab 61
61
71
60
60
72 bab
ibab 61
61
73
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 98
Пример вычисления 8-точечного БПФ…
5. Выполнение 8-точечного ПФ
1
0a 1
0b 20a 2
0b 30a 3
0b40a 4
0b
50a 5
0b51a
51b 6
0a 60b6
1a 61b
70a
70b7
1a 71b7
2a 73a 7
3b72b
0y1y 2y 3y
4y 6y5y 7y
… 70
700 bay
70
704 bay
ibay 72
722
ibay 72
726
)(22
227
1711 ibay
)(22
227
1715 ibay
)(22
227
3733 ibay
)(22
227
3737 ibay
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 99
Бит-реверсирование
Переупорядочивание элементов массива
Бит-реверсирование — это преобразование двоичного
числа, заключающееся в изменении порядка следования
бит на противоположный
01 0 0 1 = 18 10 1 0 0 = 9
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 100
Бит-реверсирование. Пример
Пример изменения индексов элементов при выполнении
бит-реверсирования над массивом из 16 элементов
0000 = 0
000 1 = 81 = 1
000 = 41 = 2
00 = 1211 = 3
000 = 2
1
= 4
00 = 101 = 5
00 = 61 = 6
0 = 1411 = 7
1
1
1
0 000
000
0 0 01
0 011
0 00
1
001
0 01
011
1
1
1
= 0 000 = 1= 8
00 1 = 91 = 9
00 = 51 = 10
0 = 1311 = 11
00 = 3
1
= 12
0 = 111 = 13
0 = 71 = 14
= 1511 = 15
1
1
1
0 00
00
0 01
011
0 0
1
01
0 1
11
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 101
Бит-реверсирование. Реализация
//in: ind - обычный порядок следования бит
//out: revInd - бит-реверсивный порядок следования бит
//size = 1 << bitsCount;
int mask = 1 << (bitsCount - 1);
revInd = 0;
for(int i=0; i<bitsCount; i++)
{
bool val = ind & mask;
revInd |= val << i;
mask = mask >> 1;
}
Первая итерация (1)
01 0 0 1
01 0 0 0mask
ind
10 0 0 0val
10 0 0 0revInd
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 102
Бит-реверсирование. Реализация
//in: ind - обычный порядок следования бит
//out: revInd - бит-реверсивный порядок следования бит
//size = 1 << bitsCount;
int mask = 1 << (bitsCount - 1);
revInd = 0;
for(int i=0; i<bitsCount; i++)
{
bool val = ind & mask;
revInd |= val << i;
mask = mask >> 1;
}
Вторая итерация (2)
01 0 0 1
00 1 0 0mask
ind
00 0 0 0val
10 0 0 0revInd
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 103
Бит-реверсирование. Реализация
//in: ind - обычный порядок следования бит
//out: revInd - бит-реверсивный порядок следования бит
//size = 1 << bitsCount;
int mask = 1 << (bitsCount - 1);
revInd = 0;
for(int i=0; i<bitsCount; i++)
{
bool val = ind & mask;
revInd |= val << i;
mask = mask >> 1;
}
Третья итерация (3)
01 0 0 1
00 0 1 0mask
ind
00 0 0 0val
10 0 0 0revInd
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 104
Бит-реверсирование. Реализация
//in: ind - обычный порядок следования бит
//out: revInd - бит-реверсивный порядок следования бит
//size = 1 << bitsCount;
int mask = 1 << (bitsCount - 1);
revInd = 0;
for(int i=0; i<bitsCount; i++)
{
bool val = ind & mask;
revInd |= val << i;
mask = mask >> 1;
}
Четвёртая итерация (4)
01 0 0 1
00 0 0 1mask
ind
10 0 0 0val
10 1 0 0revInd
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 105
Бит-реверсирование. Реализация
//in: ind - обычный порядок следования бит
//out: revInd - бит-реверсивный порядок следования бит
//size = 1 << bitsCount;
int mask = 1 << (bitsCount - 1);
revInd = 0;
for(int i=0; i<bitsCount; i++)
{
bool val = ind & mask;
revInd |= val << i;
mask = mask >> 1;
}
Пятая итерация (5)
01 0 0 1
10 0 0 0mask
ind
00 0 0 0val
10 1 0 0revInd
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 106
БПФ. Алгоритм
Бит-реверсирование
Рекурсия (БПФ)
– Вычисление БПФ над первой половиной массива
– Вычисление БПФ над второй половиной массива
– Применение «бабочки» ко всем парам элементов
in
p
ppp ebay2
in
p
pppn ebay2
2/
12
,0 n
p
Фильтрация изображений. Быстрое преобразование Фурье 107 Н.Новгород, 2011 г.
Быстрое вычисление синуса
5. Эффективность алгоритмической оптимизации никогда не
сравнится с программной.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 108
“Горячая” точка
Итак, мы воспользовались Intel VTune Amplifier XE и
обнаружили, что очень долго происходит вычисление
функций sin/cos.
Чтобы ускорить работу указанного участка кода,
необходимо вспомним тригонометрические тождества.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 109
Вспомним математику
Представим экспоненту в тригонометрической форме:
Вспомним тригонометрические тождества:
Для фиксированного n получаем:
)2sin()2cos(2
n
pi
n
pe
in
p
12
,0 n
p
)2
sin()2
)1sin(()2
cos()2
)1cos(()2
cos(nn
pnn
pn
p
)sin()sin()cos()cos()cos(
)2
sin()2
)1cos(()2
cos()2
)1sin(()2
sin(nn
pnn
pn
p
)sin()cos()cos()sin()sin(
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 110
Оптимизация вычисления тригонометрических
функций
Чтобы посчитать sin и cos, необходимо выполнить 4
операции умножения и по одной операции сложения и
вычитания:
Т.к. n фиксированное, то коэффициенты и
достаточно посчитать один раз.
)2
sin()2
)1sin(()2
cos()2
)1cos(()2
cos(nn
pnn
pn
p
)2
sin()2
)1cos(()2
cos()2
)1sin(()2
sin(nn
pnn
pn
p
)2
cos(n
)
2sin(
n
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 111
Применение оптимизации
В соответствие с указанными соотношениями выполним
оптимизацию вычисления функций sin и cos.
В цикле по j от first до first+size/2 необходимо посчитать
все значения sin(j*coeff) и cos(j*coeff).
1. Посчитаем перед циклом первые sin и cos:
sin(first*coeff) и cos(first*coeff).
2. Посчитаем перед циклом множители:
sin(coeff) и cos(coeff).
3. В цикле по j для вычисления sin(j*coeff) и cos(j*coeff)
будем использовать предыдущие значения sin и cos для
j-1 и множители в соответствии с ранее выведенными
соотношениями.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 112
Оценка эффективности
Время, потраченное на обработку видео: 77 с
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 113
Прогресс оптимизации
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 114
Анализ эффективности (1)
Достаточно низкое ускорение, полученное после оптимизации
вычисления тригонометрических функций вызвано в первую очередь
тем, что в функции SerialFFTCalculation сохраняется значительное
количество вычислений sin и cos.
Значения sin и cos многократно считаются повторно, особенно для
маленьких размерностей!
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 115
Анализ эффективности (2)
В исходной версии требовалось 𝒏 ∙ 𝒍𝒐𝒈𝒏 вычислений
синусов и косинусов, где 𝑛 – размер массива для
выполнения одномерного БПФ.
То есть для 𝑛 = 256 потребуется вычислить 2048 синусов
и косинусов.
В модифицированной версии требуется 𝟒 ∙ (𝒏 − 𝟏) вычислений синусов и косинусов, где 𝑛 – размер массива
для выполнения одномерного БПФ.
То есть для 𝑛 = 256 потребуется вычислить 1020 синусов
и косинусов.
Для больших n эффективность модифицированной
версии будет ещё выше.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 116
Ищѐм следующее проблемное место
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 117
Наиболее медленные функции
Снова большую часть времени работает функция
SerialFFTCalculation.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 118
“Горячая” точка
Функция Butterfly наиболее часто вызываемая функция. За счѐт
этого на еѐ выполнение расходуется 40% времени работы
программы.
Избавимся от лишних ветвлений в цикле – вынесем проверку
за тело цикла.
Фильтрация изображений. Быстрое преобразование Фурье 119 Н.Новгород, 2011 г.
Лишние ветвления
6. В большинстве случаев оптимизирующие компиляторы способны
выполнять высококачественные оптимизации, но если
программный код достаточно сложен, то компилятор может не
справиться с оптимизацией.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 120
Оценка эффективности
Время, потраченное на обработку видео: 75.9 с
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 121
Прогресс оптимизации
121
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 122
Анализ эффективности
Невысокое ускорение вызвано тем, что глубина рекурсии
функции SerialFFTCalculation достаточно маленькая, т.к.
обрабатываемый сигнал одномерного БПФ содержит
всего 256 точек (для рассматриваемого тестового видео).
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 123
Дальнейший анализ
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 124
Удаление “лишних” вызовов
Функция SerialFFTCalculation всѐ ещѐ остаѐтся горячей
точкой программы, поэтому продолжим еѐ оптимизацию.
Теорема об удалении рекурсии.
По каждому алгоритму можно построить эквивалентный
алгоритм без рекурсии.
Избавимся от рекурсии.
Избавимся от ―лишних‖ вызовов функций (сделаем явный
inline функций Butterfly и реализуем в виде отдельных
функции прямое и обратное одномерное БПФ).
Фильтрация изображений. Быстрое преобразование Фурье 125 Н.Новгород, 2011 г.
Разворачивание рекурсии
7. Рекурсивные реализации достаточно сложны для оптимизации +
приводят к появлению накладных расходов на организацию
рекурсии, поэтому итеративные реализации предпочтительны.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 126
Оценка эффективности
Время, потраченное на обработку видео: 60.9 с
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 127
Прогресс оптимизации
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 128
Снова профилировка
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 129
“Горячие точки”
Достаточно предсказуемо выглядит результат работы
профилировщика. Функции, выполняющие БПФ, работают
наибольшее время.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 130
Детальный анализ профиля (1)
Профиль на языке высокого уровня не даѐт сколь-либо
полезную информацию для анализа, поэтому придѐтся
обратиться к ассемблерному листингу программы.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 131
Детальный анализ профиля (2)
20.8% времени работы программы выполнялись две
функции по адресам 0x407080 и 0x40707c. Эти функции
присутствуют в профиле по 2 раза.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 132
Анализ листинга
Функция по смещению 0x7080 является перегруженным
оператором ―-‖ класса complex<double>.
Функция по смещению 0x707с является перегруженным
оператором ―*‖ класса complex<double>.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 133
Перейдѐм к native типам данных
Ранее мы отказались от использования контейнера
std::vector и это привело к ощутимому приросту
производительности.
Поступим таким же образом с классом, представляющим
комплексные числа, std::complex.
Будем представлять комплексное число в виде
последовательности из двух элементов типа double.
RealReal Image Real Image ………..
double
Комплексное
число
Фильтрация изображений. Быстрое преобразование Фурье 134 Н.Новгород, 2011 г.
Встроенные типы данных
8. Для компилятора наиболее удобно, если программа
обрабатывает встроенные типы данных.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 135
Оценка эффективности
Время, потраченное на обработку видео: 29.4 с
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 136
Прогресс оптимизации
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 137
Выбор направления оптимизации
Вычисление одномерного БПФ состоит из двух этапов:
перестановка элементов и непосредственно вычисления.
Оценим ―вклад‖ перестановки элементов в вычисление
БПФ.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 138
Анализ профиля
Функция, выполняющая перестановку элементов массива
с помощью бит-реверсирования, занимает достаточно
много времени, чтобы заняться еѐ оптимизацией.
Фильтрация изображений. Быстрое преобразование Фурье 139 Н.Новгород, 2011 г.
Делайте всѐ заранее
9. Один из наиболее простых и эффективных способов оптимизации
заключается в выполнении предвычислений, которые можно
будет использовать в основных вычислениях.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 140
Бит-реверсирование
Переупорядочивание элементов массива
Бит-реверсирование — это преобразование двоичного
числа заключающееся в изменении порядка следования
бит на противоположный
01 0 0 1 = 18 10 1 0 0 = 9
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 141
Бит-реверсирование
//in: ind - обычный порядок следования бит
//out: revInd - бит-реверсивный порядок следования бит
//size = 1 << bitsCount;
int mask = 1 << (bitsCount - 1);
revInd = 0;
for(int i=0; i<bitsCount; i++)
{
bool val = ind & mask;
revInd |= val << i;
mask = mask >> 1;
}
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 142
Бит-реверсирование
//in: ind - обычный порядок следования бит
//out: revInd - бит-реверсивный порядок следования бит
//size = 1 << bitsCount;
int mask = 1 << (bitsCount - 1);
revInd = 0;
for(int i=0; i<bitsCount; i++)
{
bool val = ind & mask;
revInd |= val << i;
mask = mask >> 1;
}
Для пересчёта каждого индекса
необходимо выполнить цикл!
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 143
Оптимизация бит-реверсирования
Известный метод:
– Давайте заранее всѐ посчитаем и во время
реверсирования будем подставлять посчитанные
значения!
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 144
Оптимизация бит-реверсирования
Создадим таблицу, в которой будут содержаться все
однобайтовые величины и их реверсивные аналоги (256
значений).
Исходное число, которое необходимо реверсировать,
разделим на байты.
Каждый байт заменим на соответствующий аналог из
таблицы.
Выполним сдвиг вправо полученного результата, если это
необходимо.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 145
Пример бит-реверсирования
Рассмотрим пример, в котором необходимо
реверсировать число, содержащее 19 значимых бит
Исходное число
Результат должен быть записан так же в 3 байта
19 бит
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 146
Пример бит-реверсирования
Записываем первый байт в инверсивном порядке (1)
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 147
Пример бит-реверсирования
Записываем второй байт в инверсивном порядке (2)
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 148
Пример бит-реверсирования
Записываем третий байт в инверсивном порядке (3)
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 149
Пример бит-реверсирования
Выполняем сдвиг на 5 бит вправо (4)
5 бит
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 150
Оценка эффективности
Время, потраченное на обработку видео: 26 с
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 151
Прогресс оптимизации
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 152
Профилировка
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 153
Анализ профиля
Функция, вычисляющая БПФ подверглась достаточно
хорошей оптимизации, поэтому выполнение функции
ProcessFrame стало занимать существенное время.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 154
Математические функции
Основную часть времени функция ProcessFrame
выполняет вычисление математических функций
(извлечение корня, возведение в степень, логарифм,
экспонента).
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 155
Оптимизация использования математических
функций (1)
Избавимся от функций pow, которые возводят в степень
число ―-1‖.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 156
Оптимизация использования математических
функций (2)
Заменим вычисление функции pow на соответствующее
умножение.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 157
Оптимизация использования математических
функций (3)
Избавимся от повторных вычислений выражений.
Фильтрация изображений. Быстрое преобразование Фурье 158 Н.Новгород, 2011 г.
Упрощение выражений
10. Применение маленьких и простых оптимизаций может приводить
к значительному сокращению времени выполнения программы.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 159
Оценка эффективности
Время, потраченное на обработку видео: 18.6 с
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 160
Прогресс оптимизации
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 161
Следующий шаг
Многие вычислительные системы имеют несколько вычислительных
ядер/процессоров. Наша тестовая система содержит 8
вычислительных ядер.
Выполним распараллеливание функции, выполняющей вычисление
БПФ, с использованием OpenMP.
Фильтрация изображений. Быстрое преобразование Фурье 162 Н.Новгород, 2011 г.
Параллельная реализация
11. Современные процессоры имеют больше одного
вычислительного ядра, поэтому разработка параллельной
программы – один из эффективных способов сократить время
работы программы.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 163
Оценка эффективности
С картинкой что-то не то!
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 164
“Гонки данных”
Рассмотрим типичную ситуацию, в которой необходима
синхронизация, называемую «гонкой данных».
Пусть есть общая переменная data, доступная
нескольким потокам для чтения и записи.
Каждый поток должен выполнить инкремент этой
переменной (то есть выполнить код data++).
Для этого процессору необходимо выполнить три
операции: чтение значения переменной из оперативной
памяти в регистр процессора, инкремент регистра, запись
посчитанного значения в переменную (в оперативную
память).
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 165
“Гонки данных”.
Ожидаемая реализация
Сначала поток 0 выполняет чтение переменной, инкремент регистра
и запись его значения в переменную, а потом поток 1 выполнит ту же
последовательность действий.
Таким образом, после завершения работы приложения значение
общей переменной будет равно data+2.
data
Поток #0
чте
ние
Поток #1
запись
data+1
Поток #0
чте
ние
Поток #1
запись
data+1 data+2
1 2
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 166
“Гонки данных”.
Менее ожидаемая реализация (1)
Поток 0 выполняет чтение значения переменной в регистр и
инкремент этого регистра, и в этот же момент времени поток 1
выполняет чтение переменной data.
Т.к. для каждого потока имеется свой набор регистров, то поток 0
продолжит выполнение и запишет в переменную значение data+1.
data
Поток #0
чте
ние
Поток #1
запись
data
Поток #0
чте
ние
Поток #1
запись
data+1data+1
1 2
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 167
“Гонки данных”.
Менее ожидаемая реализация (2)
Поток 1 также выполнит инкремент регистра (значение переменной
data было прочитано из оперативной памяти ранее до записи потоком
0 значения data+1) и сохранит значение data+1 (свое) в общую
переменную.
Таким образом, после завершения работы приложения значение
переменной будет равно data+1.
data
Поток #0
чте
ние
Поток #1
запись
data
Поток #0
чте
ние
Поток #1
запись
data+1data+1
1 2
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 168
“Гонки данных”
Обе реализации могут наблюдаться как на многоядерной
(многопроцессорной) системе, так и на
однопроцессорной, одноядерной.
Таким образом, в зависимости от порядка выполнения
команд результат работы приложения может меняться.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 169
Ищем ошибки
Вы можете наблюдать ―гонки данных‖ при работе
программы в виде искаженного изображения.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 170
Intel Inspector XE 2011. Поиск “гонок данных”
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 171
Ошибки (1)
Гонка данных: потоки используют переменную temI
параллельно для записи и чтения (fft.cpp:73, 76).
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 172
Ошибки (2)
Гонка данных: потоки используют переменную uRtmp
параллельно для записи и чтения (fft.cpp:75, 77).
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 173
Исправление ошибок
Чтобы исправить ошибки необходимо:
– либо воспользоваться директивой private:
#pragma omp parallel for private(temI, uRtmp)
– либо объявить переменные локально.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 174
Оценка эффективности
Время, потраченное на обработку видео: 32 с
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 175
Анализ эффективности
Оцените эффективность распараллеливания.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 176
Конфигурирование Intel Amplifier XE 2011
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 177
Анализ профиля (1)
Программа состоит из очень большого количества
параллельных секций.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 178
Анализ профиля (2)
Каждая параллельная секция выполняется менее 5 мкс!
Замедление программы вызвано тем, что накладные
расходы на создание параллельных секций значительно
превосходят объѐм вычислений в этих секциях.
Функция SerialFFTCalculation обрабатывает малые
массивы данных, поэтому еѐ распараллеливание не
актуально.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 179
Эффективное распараллеливание
Выполним распараллеливание двух циклов функции
SerialFFT2D. Каждая итерация в этих циклах может
выполняться независимо, т.к. на каждой итерации
обрабатывается отдельная строка (столбец) матрицы,
задающей изображение.
Параллельную реализацию поместим в функцию
ParallelFFT2D.
Аналогично поступим с функцией SerialInverseFFT2D.
Фильтрация изображений. Быстрое преобразование Фурье 180 Н.Новгород, 2011 г.
Эффективное
распараллеливание
12. Написать быструю последовательную программу сложно, а
параллельную ещѐ сложнее.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 181
Оценка эффективности
Время, потраченное на обработку видео: 8.4 с
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 182
Прогресс оптимизации
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 183
Эффективность параллельной реализации (1)
Общее ускорение по сравнению с последовательной
версией получилось всего 2.2, при том, что доступно 8
вычислительных ядер!
Дело в том, что выполнялось распараллеливание только
части программы, поэтому ускорение и не могло
получиться близким к линейному.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 184
Эффективность параллельной реализации (2)
Распараллеливание было выполнено той части кода,
который занимал 51% времени (последовательная версия
программы).
По закону Амдала получается что максимальное
ускорение будет чуть больше 2 (что и наблюдается).
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 185
Эффективность параллельной реализации (3)
Intel VTune Amplifier XE 2011 так же позволяет убедиться
что большую часть времени параллельные секции
одновременно обрабатывают 8 потоков.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 186
Полное распараллеливание
Выполним распараллеливание функции ProcessFrame.
Так же выполним следующие оптимизации:
– вынесем switch из тела цикла;
– будем выделять/освобождать динамическую память
один раз.
Фильтрация изображений. Быстрое преобразование Фурье 187 Н.Новгород, 2011 г.
Полностью параллельно
13. Распараллеливание одного алгоритма может не привести к
значительному ускорению работы программы.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 188
Оценка эффективности
Время, потраченное на обработку видео: 4.4 с
Время обработки одного кадра: 0.015 с
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 189
Прогресс оптимизации
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 190
Тестовые данные
До настоящего момента все эксперименты проводились
на одном видеофрагменте, поэтому вся оптимизация
проводилась по сути для этого файла (следовательно, и
размера картинки).
Проведѐм эксперимент на видеофрагментах с
разрешением 512x512 и 1024x1024 точек.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 191
Эксперименты
Время, потраченное на обработку видео: 24.9 с
Время обработки одного кадра: 0.065 с
Время, потраченное на обработку видео: 293.5 с
Время обработки одного кадра: 0.481 с
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 192
Анализ (1)
Основным вычислительном алгоритмом в
рассматриваемой задаче является вычисление
двумерного БПФ. Таким образом, трудоѐмкость обработки
одного кадра составляет: O h ∙ w ∙ logw + 𝑤 ∙ ℎ ∙ logh , где w
– количество точек по горизонтали в изображении, а h –
по вертикали.
Рассмотрим увеличенное в два раза по горизонтали и
вертикали изображение. Трудоѐмкость обработки такого
изображения составит:
O 4 ∙ h ∙ w ∙ log(2 ∙ w) + 4 ∙ 𝑤 ∙ ℎ ∙ log(2 ∙ h) .
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 193
Анализ (2)
Таким образом, время обработки кадра увеличенного в
два раза по горизонтали и вертикали должно замедлиться
в 4∙h∙w∙log(2∙w):4∙𝑤∙ℎ∙log(2∙h)
h∙w∙logw:𝑤∙ℎ∙logh раз.
4∙h∙w∙𝑙𝑜𝑔(2∙w):4∙𝑤∙ℎ∙𝑙𝑜𝑔(2∙h)
h∙w∙𝑙𝑜𝑔w:𝑤∙ℎ∙𝑙𝑜𝑔h= 4 ∙
𝑙𝑜𝑔2:𝑙𝑜𝑔𝑤:𝑙𝑜𝑔2:𝑙𝑜𝑔ℎ
𝑙𝑜𝑔w:𝑙𝑜𝑔h= 4 ∙
1 + 2 ∙𝑙𝑜𝑔w:𝑙𝑜𝑔h
𝑙𝑜𝑔2
;1= 4 ∙ 1 +
2
log2 𝑤:log2 ℎ
Для 𝑤 = ℎ = 256 получаем замедление в 4 ∙ 1 +2
8:8= 4.5
раза.
Для 𝑤 = ℎ = 512 получаем замедление в 4 ∙ 1 +2
9:9≈ 4.4
раза.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 194
Анализ экспериментов
При переходе от изображения размером 256x256 к
изображению размером 512x512 наблюдается
замедление в 65
15≈ 4.3 раза.
При переходе от изображения размером 512x512 к
изображению размером 1024x1024 наблюдается
замедление в 481
65= 7.4 раза.
Результаты последнего эксперимента показывают, что
замедление программы значительно больше, чем это
предсказывалось теоретически!!!
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 195
Профилировка
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 196
Профиль функции ParallelInverseFFT2D
Вычисление одномерного ДПФ по строкам работает в 10
раз быстрее, чем вычисление одномерного ДПФ по
столбцам (для TestVideo2.avi и TestVideo3.avi
соотношения будут похожими).
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 197
Детальный анализ
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 198
Анализ
Вычисление БПФ над строками приводит к тому, что
появляется большое количество инструкций доступа к
памяти, которые работают очень долго.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 199
Кеш-память
Современные процессоры содержат специальную память
(кеш-память) с быстрым доступом к данным в которую
процессор может помещать часть обрабатываемых
данных.
Часто процессоры имеют многоуровневую иерархию кеш-
памяти.
Кэш 1-го уровня имеет небольшой размер, но очень
высокую скорость работы, кэш 2-го уровня имеет большой
размер, но меньшую скорость работы и т.д.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 200
Тестовая система
Тестовая система имеет 3 уровня кеш-памяти.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 201
Модель кеш-памяти
Мы будем представлять кеш-память в виде прямоугольной матрицы.
Каждый элемент матрицы – это линейка кеш-памяти (минимальный
элемент с которым работает кеш-память).
Количество столбцов будет определять ассоциативность кэша.
Количество строк определяется соотношением <размер кеш-памяти>
/ (<ассоциативность кеш-памяти> * <размер кеш-линейки>).
Для тестовой системы рассмотрим кеш-память 2-го уровня:
– Размер кеш-памяти: 256 КБ.
– Ассоциативность: 8.
– Размер кеш-линейки: 64 Б.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 202
Тестовое изображение
Рассмотрим один кадр (одну компоненту цвета).
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 203
Выполнение ДПФ над первой строкой (1)
Первый элемент изображения занимает 16 байт (2
элемента типа double) и будет загружен в первую кеш-
линейку.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 204
Выполнение ДПФ над первой строкой (2)
Второй элемент изображения будет снова загружен в
первую кеш-линейку, т.к. размер линейки кэша составляет
64 Б.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 205
Выполнение ДПФ над первой строкой (3)
Первые 4 элемента изображения будет загружены в
первую кеш-линейку.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 206
Выполнение ДПФ над первой строкой (4)
Строка тестового изображения занимает в памяти 4 КБ и
может быть полностью загружена как в кеш-память 2-го
уровня, так и в более быстрою память 1-го уровня.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 207
Выполнение ДПФ над первым столбцом (1)
Первый элемент столбца занимает 16 байт (2 элемента
типа double) и будет загружен в первую кеш-линейку.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 208
Выполнение ДПФ над первым столбцом (2)
Второй элемент столбца находится по смещению 4 КБ (
256 * 16 Б), поэтому он будет загружен в кеш по такому же
смещению.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 209
Выполнение ДПФ над первым столбцом (3)
Каждый следующий элемент столбца смещѐн на 4 КБ.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 210
Выполнение ДПФ над первым столбцом (4)
Первые 64 элемента столбца заполнят 1
64 часть линеек
кеш-памяти.
Очередной элемент столбца может быть помещѐн только
в занятые позиции, поэтому один из находящихся в кеш-
памяти элементов будет выгружен в кеш 3-го уровня.
Повторное использование данных в кеш-памяти
происходить не будет!!!
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 211
Оптимизация
Перед выполнением одномерно БПФ поместим
обрабатываемый столбец в непрерывный массив (т.к.
БПФ имеет трудоемкость 𝑂(𝑛𝑙𝑜𝑔𝑛) то указанная
оптимизация даст положительный эффект, т.к.
трудоѐмкость копирования линейна).
Фильтрация изображений. Быстрое преобразование Фурье 212 Н.Новгород, 2011 г.
Эффективное использование
кеш-памяти
14. Перед выполнением оптимизации разработчику необходимо
подготовить представительные (наиболее типичные для
программы) данные на которых будет происходить тестирование
программы.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 213
Оценка эффективности
Время, потраченное на обработку видео: 2.9 с
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 214
Прогресс оптимизации
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 215
Результаты экспериментов
Время, потраченное на обработку видео: 16 с
Время, потраченное на обработку видео: 121.6 с
Фильтрация изображений. Быстрое преобразование Фурье 216 Н.Новгород, 2011 г.
MKL для вычисления ДПФ
15. Для многих вычислительных задач разработано большое
количество библиотек, которые содержат эффективные
реализации алгоритмов решения таких задач.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 217
Реализация БПФ
FFTW (Fastest Fourier Transform in the West)
– библиотека для вычисления ДПФ;
– GNU GPL.
Intel MKL (Math Kernel Library)
– содержит реализации большого количества
алгоритмов;
– оптимизирована для процессоров Intel;
– имеет реализацию интерфейсов FFTW.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 218
Настройка среды разработки
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 219
Ручная настройка среды разработки
Путь к заголовочным файлам
Tools → Options…→ Projects and Solutions → VC++
Directories
Show directories for: Include files
New Line: C:\Program Files\Intel\MKL\<version>\include
Путь к статическим библиотекам для линковки
Tools → Options…→ Projects and Solutions → VC++
Directories
Show directories for: Library files
New Line: C:\Program Files\Intel\MKL\<version>\<arch>\lib,
где <arch> = ia32 | em64t | ia64
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 220
Использование ДПФ в MKL
Заголовочный файл: mkl_dfti.h
Статические библиотеки:
• Базовая библиотека: mkl_core.lib
• Версия MKL:
• параллельная: mkl_intel_thread.lib
• последовательная: mkl_sequential.lib
• Тип интерфейса функций:
• cdecl: mkl_intel_c.lib
• stdcall: mkl_intel_s.lib
Помощник для линковки: http://software.intel.com/en-
us/articles/intel-mkl-link-line-advisor
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 221
Выполнение ДПФ в MKL
1. Создание дескриптора, описывающего ДПФ: DftiCreateDescriptor
2. Подтверждение дескриптора:
DftiCommitDescriptor
3. Вычисление прямого/обратного ДПФ: DftiComputeForward/DftiComputeBackward
4. Освобождение дескриптора:
DftiFreeDescriptor
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 222
Создание дескриптора
DFTI_DESCRIPTOR_HANDLE dftHandle;
MKL_LONG status;
status = DftiCreateDescriptor( &dftHandle, DFTI_DOUBLE,
DFTI_COMPLEX, 1, size);
status = DftiCommitDescriptor( dftHandle );
dftHandle – дескриптор.
status – статус выполнения функции (status = 0, если операция выполнена успешно, используя функцию DftiErrorMessage можно
получить содержательное сообщение о типе ошибки).
DFTI_DOUBLE – тип элементов над которыми будет выполнять ДПФ
– элементы двойной точности (может быть DFTI_SINGLE – одинарная
точность).
DFTI_COMPLEX – комплексная область (может быть DFTI_REAL –
действительная область).
1 – размерность ДПФ.
size – количество элементов.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 223
Создание дескриптора для двумерного ДПФ
DFTI_DESCRIPTOR_HANDLE dftHandle;
MKL_LONG status;
int size[2] = {w,h};
status = DftiCreateDescriptor( &dftHandle, DFTI_DOUBLE,
DFTI_COMPLEX, 2, size);
status = DftiCommitDescriptor( dftHandle );
2 – размерность ДПФ.
size – массив размерностей обрабатываемого массива.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 224
Вычисление ДПФ
Прямое ДПФ status = DftiComputeForward( dftHandle, mas );
mas – последовательность действительных значений.
Обратное ДПФ status = DftiComputeBackward( dftHandle, mas );
mas – последовательность комплексных значений в формате.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 225
Замечание
При выполнении обратного ДПФ по умолчанию функция DftiComputeBackward не выполняет деление на
количество элементов.
Можно реализовать ручное деление или перед выполнением операции DftiCommitDescriptor
необходимо установить коэффициент масштабирования:
DftiSetValue(handle, DFTI_BACKWARD_SCALE,
1.0 / (double)n);
1,0 ,1 1
0
2
nkeyn
xn
p
in
kp
pp
- обратное ДПФ
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 226
Освобождение дескриптора
status = DftiFreeDescriptor( &dftHandle );
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 227
Использование MKL (задание)
Откройте проект 14. filter (on the fly)\filter.sln.
Заменить ручное вычисление ДПФ на вычисление из
MKL:
– В файле filter.cpp функции ParallelFFT2D и
ParallelInverseFFT2D выполняют вычисление ДПФ для
каждой компоненты цвета. Для вычислений
используются два массива для каждого канала
(inp<R,G,B>, out<R,G,B>). Функциям MKL будет
достаточно одного массива для каждого канала.
Сравните быстродействие исходной версии и версии с
MKL на различных видеофрагментах.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 228
Оценка эффективности
Время, потраченное на обработку видео: 1.6 с
Фильтрация изображений. Быстрое преобразование Фурье 229 Н.Новгород, 2011 г.
Тестовая система
15.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 230
Аппаратная часть
8-ядерный процессор Intel Core i7
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 231
Программное обеспечение
Microsoft Visual Studio 2008
– Version 9.0.21022.8
– Microsoft (R) 32-bit C/C++ Optimizing Compiler Version
15.00.21022.08 for 80x86
Intel Parallel Studio XE 2011
– Intel Composer XE 2011 (package 104)
• Intel(R) C++ Compiler XE for applications running on IA-32,
Version 12.0.0.104
– Intel Inspector XE 2011 (build 119192)
– Intel VTune Amplifier XE 2011 (build 119041)
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 232
Спасибо за внимание!
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 233
Задания для самостоятельной работы…
Перейти от использования типа double к типу float. Оценить
корректность получаемых данных и эффективность
реализации
Реализовать одну функцию вычисления БПФ для всех трѐх
компонент цвета. Оценить эффективность реализации
Реализовать функцию, выполняющую перестановку
элементов массива на основании таблицы с реверсивными
двухбайтовыми числами (таблица на 65536 записей). Оценить
эффективность реализации
Реализовать функцию, выполняющую перестановку
элементов массива сразу для всех строк/столбцов
обрабатываемого изображения. Оценить эффективность
реализации
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 234
Задания для самостоятельной работы
Реализовать in-place алгоритм БПФ без использования
перестановки элементов массива. Оценить эффективность
реализации.
Реализовать алгоритм БПФ на общий случай размера
входного сигнала из. Оценить эффективность реализации.
Оценить эффективность динамического планирования в
OpenMP-версии по сравнению со статическим.
Реализовать одну глобальную параллельную секцию в
программе в функции ProcessFrame. Оценить эффективность
параллельной версии.
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 235
Источники информации
Кудрявцев Л. Д. Краткий курс математического анализа. Т.
2. Дифференциальное и интегральное исчисления
функций многих переменных. Гармонический анализ:
Учебник. — 3-е изд., перераб. — М.: ФИЗМАТЛИТ, 2005.
— 424 с.
Тропченко А.Ю., Тропченко А.А. Методы сжатия
изображений, аудиосигналов и видео. Учебное пособие
по дисциплине «Теоретическая информатика» - Санкт-
Петербург: , 2009. — 108 с.
Гонсалес Р., Вудс Р. Цифровая обработка изображений.
Москва: Техносфера, 2005 г. — 1072 c.
Дискретное преобразование Фурье (ДПФ).
[http://dsplib.ru/content/dft/dft.html]
Фильтрация изображений. Быстрое преобразование Фурье Н.Новгород, 2011 г. 236
Авторский коллектив
Сиднев Алексей Александрович,
ассистент кафедры
Математического обеспечения ЭВМ факультета ВМК ННГУ