Участник:Ivanov.kir.m/Быстрое дискретное преобразование Фурье: различия между версиями
IgorS (обсуждение | вклад) |
Kronberg (обсуждение | вклад) |
||
| Строка 1: | Строка 1: | ||
| − | {{Assignment|IgorS}} | + | {{Assignment|IgorS|Kronberg}} |
{{algorithm | {{algorithm | ||
Текущая версия на 17:09, 29 ноября 2016
| Эта работа успешно выполнена Преподавателю: в основное пространство, в подстраницу Данное задание было проверено и зачтено. Проверено Kronberg и IgorS. |
| Алгоритм одномерного преобразования Фурье для действительных чисел | |
| Последовательный алгоритм | |
| Последовательная сложность | ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
| Объём входных данных | ![]() |
| Объём выходных данных | ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
| Параллельный алгоритм | |
| Высота ярусно-параллельной формы | ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
| Ширина ярусно-параллельной формы | ![]() |
Авторы описания К.М.Иванов, А.C.Сапин Вклад каждого участника равномерный, поскольку каждый пункт вычитывался и исправлялся обоими участниками. При сильном приближении можно сказать,что больший вклад К.М.Иванов внес в заполнение теоретической части, а А.C.Сапин в заполнение практической части.
Быстрое преобразование Фурье (БПФ, FFT) — алгоритм быстрого вычисления дискретного преобразования Фурье (ДПФ). То есть, алгоритм вычисления за количество действий, меньшее чем 














Содержание
- 1 ЧАСТЬ. Свойства и структура алгоритмов
- 1.1 Общее описание алгоритма
- 1.2 Математическое описание алгоритма
- 1.3 Вычислительное ядро алгоритма
- 1.4 Макроструктура алгоритма
- 1.5 Схема реализации последовательного алгоритма
- 1.6 Последовательная сложность алгоритма
- 1.7 Информационный граф
- 1.8 Ресурс параллелизма алгоритма
- 1.9 Входные и выходные данные алгоритма
- 1.10 Свойства алгоритма
- 2 ЧАСТЬ. Программная реализация алгоритма
- 2.1 Особенности последовательной реализации алгоритма
- 2.2 Локальность данных и вычислений
- 2.3 Возможные способы и особенности параллельной реализации алгоритма
- 2.4 Масштабируемость алгоритма и его реализации
- 2.5 Динамические характеристики и эффективность реализации алгоритма
- 2.6 Выводы для классов архитектур
- 2.7 Существующие реализации алгоритма
- 3 Литература
1 ЧАСТЬ. Свойства и структура алгоритмов
1.1 Общее описание алгоритма
Быстрое дискретное преобразование Фурье (БПФ) - популярный в современном мире математический метод преобразования вектора/матрицы комплексных/действительных чисел — сигнала — в вектор/матрицу комплексных чисел — спектр. С математической точки зрения преобразование сигнала 



В отличие от своего классического аналога, БПФ имеет сложность 












Область применения данного метода простирается от обработки аудио информации до собственно спектрального анализа. Поскольку в общем случае алгоритм БПФ применим к произвольным векторам чисел, выделяют отдельные подзадачи, для которых можно ввести дополнительную оптимизацию. Одной из таких подзадач является быстрое преобразование Фурье вектора действительных чисел, которому и посвящена данная статья. В качестве тестируемой реализации был выбран алгоритм Кули-Тьюки в библиотеке FFTW, написанной на языке C.
Замечание: Поскольку общие описание алгоритма БПФ весьма сложно, в некоторых пунктах данная статья будет ссылаться на простой случай — алгоритм Кули-Тьюки быстрого преобразование Фурье для векторов с размерностью равной степени двойки. Отличительной особенностью данного алгоритма является то, что он обходится без использования специфических приемов, использующихся именно для степеней четверки, восьмерки и т.п. Однако благодаря тому, что на вход данному алгоритму подается вектор чисто вещественных чисел, выходной вектор удовлетворяет эрмитовой избыточности (Hermitian redundancy) , т.е. 













1.2 Математическое описание алгоритма
Входные данные: вектор действительных чисел 















Выходные данные: вектор комплексных чисел 















Дискретное преобразование Фурье задается следующей формулой:














































В простейшем случае(для степеней двойки) алгоритм Кули-Тьюки рассчитывает ДПФ для четных 



























































































Таким образом, получается рекурсивный алгоритм, работающий по принципу разделяй и влавствуй.
1.2.1 Рекурсивное описание
Алгоритм:
- Входной вектор
преобразуется в матрицу

















размера
, где




и























































































- К каждой строке полученной матрицы применяется быстрое дискретное преобразование Фурье (БПФ) порядка


- Каждый элемент полученный после применения БПФ умножается на поворотные множители
, где



















- номер строки, а
- номер столбца
- Полученная после шагов 1-2 матрица
транспонируется
- К каждой строке матрицы
применяется БПФ порядка



Так как алгоритм реализует принцип «разделяй и властвуй», глубина рекурсии составляет 






Замечание: Как правило все поворотные множители вычисляются заранее и хранятся в специальном массиве.
Замечание: В общем случае 









Замечание: В случае простого 
1.3 Вычислительное ядро алгоритма
В случае размерности входа равной степени двойки, вычислительным ядром алгоритма является так называемая, "бабочка". В простейшем случае "бабочка" представляет из себя двухточечное преобразование. Рассмотрим этот случай:
На вход алгоритму подается двухэлементный вектор ‒ 














































































Данный процесс удобно изобразить с помощью следующей схемы:
Для 4-х элеметного вектора 


































































































































































Схема в таком случае будет выглядеть следующим образом:
Для случая, когда вход не является степенью двойки, "бабочки" будут "несимментричными", но в остальном вычисления будут проходить схожим образом.
1.4 Макроструктура алгоритма
Для исходного вектора 



























БПФ порядка



умножение комплексных чисел




БПФ порядка



1.5 Схема реализации последовательного алгоритма
Схема организации состоит в том, что на каждом шаге 






























1.6 Последовательная сложность алгоритма
Быстрое дискретное преобразование Фурье выполнимо за 


























































































Основной шаг алгоритма состоит в сведении задачи для 










Пусть мы уже умеем решать задачу для 




































































































В общем случае:
Пусть 
















































































































Таким образом задача сведена к вычислению свёртки, а это можно сделать с помощью трёх преобразований Фурье для 



























Вычисления всех 







































1.7 Информационный граф
Как видно из рисунка, размер этого графа линейно-логарифмический, а формулы дуг имеют экспоненциальные компоненты.
1.8 Ресурс параллелизма алгоритма
Если считать только главные члены выражений, то простой алгоритм Кули-Тьюки имеет критический путь, состоящий из 














Кроме того, параллелизм БПФ можно увеличить, если брать 



1.9 Входные и выходные данные алгоритма
Входные данные: вектор действительных/комплексных чисел 















Выходные данные: вектор комплексных чисел 





















Есть несколько ситуаций, при которых количество потребляемой памяти для хранения входного вектора 

- Если
— вектор действительных чисел, тогда
;




- Если
— вектор чисто-мнимых чисел, тогда
;





- Если
, тогда




— вектор действительных чисел;
- Если
, то





— вектор чисто-мнимых чисел.
Где матрица 
1.10 Свойства алгоритма
Таким образом в общем у алгоритма БПФ в случае неограниченных ресурсов:
- последовательная сложность - линейно-логарифмическая
- параллельная сложность - логарифмическая.
При этом алгоритм полностью детерминирован.
2 ЧАСТЬ. Программная реализация алгоритма
В качестве тестируемой реализации была выбрана библиотека FFTW, а именно функция, выполняющая БПФ одномерного вектора действительных чисел.
2.1 Особенности последовательной реализации алгоритма
Простейший вариант алгоритма для степеней двойки на языке C:
#include <stdio.h>
#include <math.h>
#include <complex.h>
typedef double complex cplx;
void _fft(cplx *buf, cplx *out, int n, int step)
{
if (step < n) {
_fft(out, buf, n, step * 2); //рекурсивный рассчет
_fft(out + step, buf + step, n, step * 2);
for (int i = 0; i < n; i += 2 * step) {
cplx t = cexp(-I * PI * i / n) * out[i + step];
buf[i / 2] = out[i] + t;
buf[(i + n)/2] = out[i] - t;
}
}
}
void fft(cplx *buf, int n)
{
cplx out[n];
for (int i = 0; i < n; i++) out[i] = buf[i];
_fft(buf, out, n, 1);
}
2.2 Локальность данных и вычислений
2.3 Возможные способы и особенности параллельной реализации алгоритма
2.4 Масштабируемость алгоритма и его реализации
Тестирование проводилось на вычислительном комплексе IBM Blue Gene/P
2.4.1 Описание платформы IBM Blue Gene/P
IBM Blue Gene/P — массивно-параллельная вычислительная система, которая состоит из двух стоек, включающих 8192 процессорных ядер (2 x 1024 четырехъядерных вычислительных узлов), с пиковой производительностью 27,9 терафлопс (27,8528 триллионов операций с плавающей точкой в секунду).
Характеристики системы:
- две стойки с вычислительными узлами и узлами ввода-вывода
- 1024 четырехъядерных вычислительных узла в каждой из стоек
- 16 узлов ввода-вывода в стойке (в текущей конфигурации активны 8, т.е. одна I/O-карта на 128 вычислительных узлов)
- выделенные коммуникационные сети для межпроцессорных обменов и глобальных операций
- программирование с использованием MPI, OpenMP/pthreads, POSIX I/O
- высокая энергоэффективность: ∼ 372 MFlops/W (см. список Green500)
- система воздушного охлаждения
Стойка (rack, cabinet) состоит из двух midplane'ов. В midplane входит 16 node-карт (compute node card), на каждой из которых установлено 32 вычислительных узла (compute card). Midplane, 8 x 8 x 8 = 512 вычислительных узлов, — минимальный раздел, на котором становится доступна топология трехмерного тора; для разделов меньших размеров используется топология трехмерной решетки. Node-карта может содержать до двух узлов ввода-вывода (I/O card). Вычислительный узел включает в себя четырехъядерный процессор, 2 ГБ общей памяти и сетевые интерфейсы.
Микропроцессорное ядро:
- модель: PowerPC 450
- рабочая частота: 850 MHz
- адресация: 32-битная
- кэш инструкций 1-го уровня (L1 instruction): 32 KB
- кэш данных 1-го уровня (L1 data): 32 KB
- кэш предвыборки (L2 prefetch): 14 потоков предварительной выборки (stream prefetching): 14 x 256 байтов
- два блока 64-битной арифметики с плавающей точкой (Floating Point Unit, FPU), каждый из которых может выдавать за один такт результат совмещенной операции умножения-сложения (Fused Multiply-Add, FMA)
- пиковая производительность: 2 FPU x 2 FMA x 850 MHz = 3,4 GFlop/sec per core
Вычислительные узлы и I/O-карты в аппаратном смысле неразличимы и являются взаимозаменяемыми, разница между ними состоит лишь в способе их использования. У них нет локальной файловой системы, поэтому все операции ввода-вывода перенаправляются внешним устройствам.
Вычислительной узел:
- четыре микропроцессорных ядра PowerPC 450 (4-way SMP)
- пиковая производительность: 4 cores x 3,4 GFlop/sec per core = 13,6 GFlop/sec
- пропускная способность памяти: 13,6 GB/sec
- 2 ГБ общей памяти
- 2 x 4 МБ кэш-памяти 2-го уровня (в документации по BG/P носит название L3)
- легковесное ядро (compute node kernel, CNK), представляющее собой Linux-подобную операционную систему, поддерживающую значительное подмножество Linux-совместимых системных вызовов
- асинхронные операции межпроцессорных обменов (выполняются параллельно с вычислениями)
- операции ввода-вывода перенаправляются I/O-картам через сеть коллективных операций
2.4.2 Оценка масштабируемости алгоритма
Масштабируемость алгоритма проверялась с помощью тестовой программы расположенной по ссылке. Для эксперимента использовались:
- Компилятор mpicc
- Библиотека OpenMPI версии 1.68
- Библиотека FFTW 3.3.5
Алгоритм тестировался на входных векторах размера 





Из графиков можно сделать следующие выводы:
- Значительное увеличение числа процессоров не дает значимого уменьшения времени исполнения, что отражено и на графике эффективности. Это означает, что время, в основном, расходуется на пересылки данных, а не на рассчет.
- При большом количестве элементов и маленьком числе процессоров наблюдается сверхлинейное ускорение, что связано с маленьким число пересылок и активным использованием кеша.
2.5 Динамические характеристики и эффективность реализации алгоритма
2.6 Выводы для классов архитектур
2.7 Существующие реализации алгоритма
Наиболее известной библиотекой для выполнения различных вариантов быстрого преобразования Фурье является FFTW, разработанная Матео Фриго и Стивеном Джонсоном в Массачусетском технологическом институте. Для преобразования небольших объемов данных используется алгоритм Кули - Тьюки, в случае входа больших размеров используется алгоритм Радера или Блюштейна. Библиотека считается самой быстрой реализацией БПФ и на входах любых размеров и размерностей сохраняет ассимптотическую сложность 










FFTW изначально написана на языке C, однако имеет API для нескольких языков, в том числе Fortran и Ada. Открытая версия библиотеки распространяется под лицензией GNU General Public License. Также существует реализация для коммерческого использования распространяемая под лицензией MIT.
Существует несколько реализаций алгоритма, для рассчета на GPU:
3 Литература
[1] Википедия [Электронный ресурс]. Тема: Быстрое преобразование Фурье – Электрон. дан. – URL Быстрое преобразование Фурье (дата обращения 17.09.2016)
[2] Бахвалов Н. С., Жидков Н. П., Кобельков. Г. М. — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. — 636 с.
[3] FFTW [Электронный ресурс]. Тема: One-Dimensional DFTs of Real Data – Электрон. дан. – URL One-Dimensional DFTs of Real Data (последняя дата обращения 14.19.2016)
[4] FFTW [Электронный ресурс]. – Электрон. дан. – URL FFTW Lib (последняя дата обращения 14.19.2016)



















