Россия, Новосибирск, НГПУ, 2009 |
Программирование на языке MC#
5.3. Быстрое преобразование Фурье
Напомним коротко некоторые понятия и определения, относящиеся к дискретному преобразованию Фурье и быстрым алгоритмам его вычисления. Более подробно об этом см., например, в главе 32.2 "Дискретное преобразование Фурье. Быстрый алгоритм" книги [6].
называется главным значением корня степени n из единицы.
Вектор y=(y0, y1, … , yn-1) называется дискретным преобразованием Фурье вектора a=(a0, a1, … , an-1), где ai и yj ( 0 <= i, j <= n ) есть комплексные числа, если
Быстрое преобразование Фурье (БПФ) представляет собой метод быстрого вычисления дискретного преобразования Фурье, использующий свойства комплексных корней из единицы и требующий времени O(n log n), в отличие от времени O(n2) при прямом вычислении по формуле.
В случае, когда n есть степень двойки, имеется следующий алгоритм быстрого преобразования Фурье вектора a=(a0, a1, … , an-1):
Легко видеть, что используемый в данном алгоритме двоичный принцип "разделяй и властвуй" аналогичен принципам, реализованным в предыдущих программах вычисления чисел Фибоначчи и обхода двоичного дерева.
Ниже приведен текст на языке MC# асинхронного метода, реализующего приведенный выше рекурсивный алгоритм. Полный текст этой программы можно найти в приложении [ "Программирование на языке MC#" ].
Однако, данная программа, даже с оптимизациями, аналогичными рассмотренным для программ Fib и SumBinTree, не дает ускорения при исполнении на параллельной архитектуре из-за больших объемов требуемой памяти ( в 2 раза бoльших, чем для последовательного варианта), необходимой для размещения массивов a[0], a[1], y[0], y[1] при рекурсивных вызовах.
Существуют более эффективные алгоритмы БПФ, например, итеративный алгоритм из главы 32.3 "Эффективные реализации быстрого преобразования Фурье" из книги [6]. Однако, данный алгоритм естественным образом параллелится только на 2 процессора. Реализацию такого алгоритма на языке MC# см. в приложении [ "Программирование на языке MC#" ].
Ниже представлены графики времени исполнения последовательного и итеративного параллельного (на 2 процессора) алгоритмов БПФ, реализованных на языке MC#.
Тестовые замеры проводились на машине с двухядерным процессором Intel Core 2 Duo 2.4 GHz и оперативной памятью 1 Гб.