Я намагаюся паралелізувати обчислення FFT на файлах сигналів розміром терабайт. Наразі така FFT, що використовує бібліотеку з відкритим кодом, займає багато годин, навіть працює через CUDA на найшвидшому графічному процесорі. Основою, яку я намагаюся адаптувати до цього процесу, є Hadoop. По суті, Hadoop розподіляє проблему на будь-яку кількість вузлів сервера таким чином:
• Ви розділите вхідний файл на (ключ, значення) пари.
• Ці пари подаються в алгоритм "Map", який перетворює ваші (ключ, значення) пари в деякі інші (ключ, значення) пари на основі того, що ви помістили всередину Map.
• Рамка потім збирає всі (ключ, значення) виводи з Карт і сортує їх за клавішами, а також агрегує значення з одним ключем до однієї пари, так що ви закінчуєте (ключ, список (значення1, значення2, ..)) пари
• Ці пари потім подаються в алгоритм «Зменшити», який, у свою чергу, виводить більше (ключ, значення) пар як ваш кінцевий результат (записується у файл).
Існує багато застосувань для цієї моделі в таких практичних речах, як обробка журналів серверів, але мені важко застосовувати рамки для подрібнення FFT на завдання "map" та "reduction", тим більше, що я не дуже знайомий з DSP.
Я не буду заважати вам мамбо програмуванням, оскільки це DSP Q&A. Я, однак, розгублений у тому, які алгоритми існують для обчислення FFT паралельно; Завдання "Зробити карту" та "Зменшити" не можуть (технічно) говорити між собою, тому FFT необхідно розділити на незалежні проблеми, з яких результати можна якось рекомбінувати наприкінці.
Я запрограмував просту реалізацію Cooley-Tukey Radix 2 DIT, яка працює на невеликих прикладах, але використовувати її для рекурсивного обчислення непарних / парних показників DFT на мільярд байтів не вийде. Я витратив кілька тижнів на читання багатьох статей, у тому числі й на алгоритмі MapReduce FFT (написаний Tsz-Wo Sze як частина його статті про множення SSA, я не можу пов’язати більше двох гіперпосилань) та «чотиришагової FFT» ( тут і тут), які схожі між собою і на те, що я намагаюся досягти. Однак я безнадійно поганий у математиці, і застосовуючи будь-який із цих методів вручну до простого набору чогось типу {1,2, 3, 4, 5, 6, 7, 8} (з усіма уявними компонентами 0) мені дико невірні результати. Чи може хтось пояснити мені ефективний паралельний алгоритм FFT простою англійською мовою (той, який я пов’язав чи будь-який інший), щоб я міг спробувати запрограмувати його?
Редагувати: Джим Клей та хтось інший, хто може бути збентежений моїм поясненням, я намагаюся зробити один FFT з терабайтного файлу. Але я хочу вміти робити це одночасно на декількох серверах, щоб прискорити процес.