Я пытаюсь распараллелить вычисление FFT на файлах сигналов терабайтового размера. Прямо сейчас такое БПФ, использующее библиотеку с открытым исходным кодом, занимает много часов, даже через CUDA на самом быстром из имеющихся у меня графических процессоров. Основой, которую я пытаюсь адаптировать к этому процессу, является Hadoop. В самых основных терминах Hadoop распределяет проблему по любому количеству узлов сервера следующим образом:
• Вы разбили входной файл на пары (ключ, значение).
• Эти пары подаются в алгоритм «Карта», который преобразует ваши пары (ключ, значение) в некоторые другие пары (ключ, значение) в зависимости от того, что вы поместили в карту.
• Затем платформа собирает все выходные данные (ключ, значение) из карт и сортирует их по ключу, а также объединяет значения с одним и тем же ключом в одну пару, поэтому в итоге вы получаете (ключ, список (значение1, значение2, ..)) пары
• Эти пары затем передаются в алгоритм «Reduce», который, в свою очередь, выводит больше пар (ключ, значение) в качестве вашего конечного результата (записанного в файл).
Существует множество приложений для этой модели в таких практических вещах, как обработка журналов сервера, но мне трудно применить среду для разбиения FFT на «карту» и «сокращения» задач, тем более что я не очень знаком с DSP.
Я не буду беспокоить вас программированием Mumbo Jumbo, так как это DSP Q & A. Однако я не совсем понимаю, какие существуют алгоритмы для параллельного вычисления БПФ; Задачи Map и Reduce не могут (технически) взаимодействовать друг с другом, поэтому БПФ должно быть разделено на независимые задачи, из которых результаты могут быть каким-то образом объединены в конце.
Я запрограммировал простую реализацию Cooley-Tukey Radix 2 DIT, которая работает на небольших примерах, но использовать ее для рекурсивного вычисления DFT с нечетным / четным индексом для миллиарда байтов не будет. Я потратил несколько недель на чтение многих работ, в том числе одного по алгоритму MapReduce FFT (написанного Tsz-Wo Sze как часть его статьи о умножении SSA, я не могу связать более двух гиперссылок) и «четырехступенчатого БПФ» ( здесь и здесь), которые кажутся похожими друг на друга и на то, что я пытаюсь достичь. Однако я безнадежно плохо разбираюсь в математике, и применение любого из этих методов вручную к простому набору чего-то вроде {1,2, 3, 4, 5, 6, 7, 8} (со всеми мнимыми компонентами равными 0) дает мне дико неверные результаты. Может ли кто-нибудь объяснить мне эффективный параллельный алгоритм FFT на простом английском языке (тот, который я связал, или любой другой), чтобы я мог попробовать его запрограммировать?
Редактировать: Джим Клэй и любой другой, кто может быть смущен моим объяснением, я пытаюсь сделать один FFT файла терабайта. Но я хочу сделать это одновременно на нескольких серверах, чтобы ускорить процесс.