Estou tentando paralelizar o cálculo de uma FFT em arquivos de sinal do tamanho de terabytes. No momento, essa FFT usando uma biblioteca de código aberto leva muitas horas, mesmo sendo executada no CUDA na GPU mais rápida que eu tenho. A estrutura que estou tentando adaptar a esse processo é o Hadoop. Em termos muito básicos, o Hadoop distribui um problema por qualquer número de nós do servidor da seguinte maneira:
• Você divide seu arquivo de entrada em pares (chave, valor).
• Esses pares são inseridos no algoritmo "Mapa", que transforma seus pares (chave, valor) em outros pares (chave, valor) com base no que você coloca dentro do Mapa.
• A estrutura coleta todas as saídas (chave, valor) dos Mapas e as classifica por chave, além de agregar valores com a mesma chave a um único par, para que você acabe com (chave, lista (valor1, valor2, ..)) pares
• Esses pares são inseridos no algoritmo "Reduzir", que, por sua vez, gera mais pares (chave, valor) como resultado final (gravado em um arquivo).
Existem muitos aplicativos para esse modelo em itens práticos, como o processamento de logs do servidor, mas estou tendo dificuldade em aplicar a estrutura para dividir uma FFT em tarefas de "mapa" e "redução", especialmente porque eu não estou realmente familiarizado com o DSP.
Não vou incomodá-lo com o mumbo jumbo de programação, pois este é um Q & A de DSP. No entanto, estou confuso sobre quais algoritmos existem para calcular FFTs em paralelo; As tarefas Mapear e Reduzir não podem (tecnicamente) se comunicar, portanto a FFT deve ser dividida em problemas independentes, dos quais os resultados podem de alguma forma ser recombinados no final.
Programei uma implementação simples do Cooley-Tukey Radix 2 DIT que funciona em pequenos exemplos, mas usá-lo para calcular recursivamente DFTs de índices ímpares / pares para um bilhão de bytes não funcionará. Passei algumas semanas lendo muitos artigos, incluindo um sobre o algoritmo MapReduce FFT (escrito por Tsz-Wo Sze como parte de seu artigo sobre multiplicação de SSA, não consigo vincular mais de 2 hiperlinks) e o “FFT em quatro etapas” ( aqui e aqui), que parecem semelhantes entre si e com o que estou tentando realizar. No entanto, sou irremediavelmente ruim em matemática, e aplicar qualquer um desses métodos manualmente a um conjunto simples de algo como {1,2, 3, 4, 5, 6, 7, 8} (com todos os componentes imaginários sendo 0) me resultados extremamente incorretos. Alguém pode me explicar um algoritmo FFT paralelo eficiente em inglês simples (um que vinculei ou outro) para que eu possa tentar programá-lo?
Edit: Jim Clay e qualquer outra pessoa que possa estar confusa com a minha explicação, estou tentando fazer uma única FFT do arquivo terabyte. Mas quero fazê-lo simultaneamente em vários servidores para acelerar o processo.