Sto cercando di parallelizzare il calcolo di una FFT su file di segnale di dimensioni terabyte. In questo momento un tale FFT che utilizza una libreria open source richiede molte ore, anche passando attraverso CUDA sulla GPU più veloce che ho. Il framework che sto cercando di adattare a questo processo è Hadoop. In termini molto basilari, Hadoop distribuisce un problema su un numero qualsiasi di nodi server nel modo seguente:
• È stato suddiviso il file di input in coppie (chiave, valore).
• Queste coppie vengono inserite in un algoritmo "Mappa", che trasforma le tue coppie (chiave, valore) in alcune altre coppie (chiave, valore) in base a ciò che inserisci nella mappa.
• Il framework raccoglie quindi tutti gli output (chiave, valore) dalle mappe e li ordina per chiave, nonché aggregando i valori con la stessa chiave in una singola coppia, quindi si finisce con (chiave, elenco (valore1, valore2, ..)) coppie
• Queste coppie vengono quindi inserite in un algoritmo di "Riduzione", che a sua volta genera più coppie (chiave, valore) come risultato finale (scritto in un file).
Esistono molte applicazioni per questo modello in cose pratiche come l'elaborazione dei registri del server, ma non riesco ad applicare il framework per tagliare una FFT in attività di "mappa" e "riduzione", soprattutto perché non ho familiarità con DSP.
Non ti darò fastidio con il jumbo mumbo di programmazione, poiché si tratta di domande e risposte DSP. Sono, tuttavia, confuso su quali algoritmi esistono per il calcolo di FFT in parallelo; Le attività di mappatura e riduzione non possono (tecnicamente) parlare tra loro, quindi la FFT deve essere suddivisa in problemi indipendenti dai quali i risultati possono in qualche modo essere ricombinati alla fine.
Ho programmato una semplice implementazione di Cooley-Tukey Radix 2 DIT che funziona su piccoli esempi, ma usarlo per il calcolo ricorsivo di DFT su indici dispari / pari per un miliardo di byte non funzionerà. Ho trascorso alcune settimane a leggere molti articoli, incluso uno su un algoritmo MapReduce FFT (scritto da Tsz-Wo Sze come parte del suo articolo sulla moltiplicazione SSA, non riesco a collegare più di 2 collegamenti ipertestuali) e il "FFT a quattro fasi" ( qui e qui), che sembrano simili tra loro e a ciò che sto cercando di realizzare. Tuttavia, sono irrimediabilmente cattivo in matematica e l'applicazione manuale di uno di questi metodi a un semplice insieme di qualcosa come {1,2, 3, 4, 5, 6, 7, 8} (con tutti i componenti immaginari pari a 0) dà risultati selvaggiamente errati. Qualcuno può spiegarmi un algoritmo FFT parallelo efficiente in un inglese semplice (uno che ho collegato o altro) in modo da poter provare a programmarlo?
Modifica: Jim Clay e chiunque altro possa essere confuso dalla mia spiegazione, sto provando a fare una sola FFT del file terabyte. Ma voglio poterlo fare contemporaneamente su più server per accelerare il processo.