Estoy tratando de paralelizar el cálculo de una FFT en archivos de señal de tamaño terabyte. En este momento, una FFT que utiliza una biblioteca de código abierto lleva muchas horas, incluso a través de CUDA en la GPU más rápida que tengo. El marco que estoy tratando de adaptar a este proceso es Hadoop. En términos muy básicos, Hadoop distribuye un problema en cualquier número de nodos del servidor de la siguiente manera:
• Divide su archivo de entrada en pares (clave, valor).
• Estos pares se introducen en un algoritmo de "Mapa", que transforma sus pares (clave, valor) en otros pares (clave, valor) en función de lo que coloque dentro del Mapa.
• Luego, el marco recopila todos los resultados (clave, valor) de los mapas y los ordena por clave, además de agregar valores con la misma clave a un solo par, por lo que termina con (clave, lista (valor1, valor2, ..)) pares
• Estos pares se introducen en un algoritmo "Reducir", que a su vez genera más pares (clave, valor) como resultado final (escrito en un archivo).
Hay muchas aplicaciones para este modelo en cuestiones prácticas como el procesamiento de registros del servidor, pero me resulta difícil aplicar el marco para dividir un FFT en tareas de "mapa" y "reducir", especialmente porque no estoy realmente familiarizado con DSP.
No te molestaré con la programación mumbo jumbo, ya que este es un DSP Q&A. Sin embargo, estoy confundido sobre qué algoritmos existen para calcular FFT en paralelo; Las tareas de mapeo y reducción no pueden (técnicamente) comunicarse entre sí, por lo que la FFT debe dividirse en problemas independientes a partir de los cuales los resultados se pueden recombinar de alguna manera al final.
He programado una implementación simple de Cooley-Tukey Radix 2 DIT que funciona en pequeños ejemplos, pero usarlo para calcular recursivamente los DFT de índice impar / par por mil millones de bytes no funcionará. He pasado algunas semanas leyendo muchos documentos, incluido uno en un algoritmo MapReduce FFT (escrito por Tsz-Wo Sze como parte de su artículo sobre la multiplicación SSA, no puedo vincular más de 2 hipervínculos) y el "FFT de cuatro pasos" ( aquí y aquí), que parecen similares entre sí y con lo que estoy tratando de lograr. Sin embargo, soy irremediablemente malo en matemáticas, y aplicar cualquiera de esos métodos a mano a un conjunto simple de algo como {1,2, 3, 4, 5, 6, 7, 8} (con todos los componentes imaginarios siendo 0) da Me resultados muy incorrectos. ¿Alguien puede explicarme un algoritmo FFT paralelo eficiente en inglés simple (uno que vinculé u otro) para que pueda intentar programarlo?
Editar: Jim Clay y cualquier otra persona que pueda estar confundida por mi explicación, estoy tratando de hacer una sola FFT del archivo de terabytes. Pero quiero poder hacerlo simultáneamente en varios servidores para acelerar el proceso.