Ich versuche, die Berechnung einer FFT für Terabyte große Signaldateien zu parallelisieren. Im Moment dauert eine solche FFT mit einer Open-Source-Bibliothek viele Stunden, selbst wenn sie mit der schnellsten GPU, die ich habe, durch CUDA läuft. Das Framework, das ich an diesen Prozess anpassen möchte, ist Hadoop. Grundsätzlich verteilt Hadoop ein Problem auf folgende Weise auf eine beliebige Anzahl von Serverknoten:
• Sie teilen Ihre Eingabedatei in Paare (Schlüssel, Wert) auf.
• Diese Paare werden in einen "Map" -Algorithmus eingespeist, der Ihre (Schlüssel-, Wert-) Paare in einige andere (Schlüssel-, Wert-) Paare umwandelt, je nachdem, was Sie in die Map einfügen.
• Das Framework sammelt dann alle (Schlüssel-, Wert-) Ausgaben der Maps und sortiert sie nach Schlüssel. Außerdem werden die Werte mit demselben Schlüssel zu einem einzigen Paar zusammengefasst, sodass Sie am Ende (Schlüssel, Liste (Wert1, Wert2, ..)) Paare
• Diese Paare werden dann in einen "Reduzieren" -Algorithmus eingespeist, der wiederum mehr (Schlüssel, Wert) Paare als Ihr Endergebnis ausgibt (in eine Datei geschrieben).
Es gibt viele Anwendungen für dieses Modell in praktischen Dingen wie der Verarbeitung von Serverprotokollen, aber es fällt mir schwer, das Framework zum Zerlegen einer FFT in "Map" - und "Reduction" -Aufgaben anzuwenden, zumal ich mit DSP nicht wirklich vertraut bin.
Ich werde Sie mit dem Programmier-Hokuspokus nicht belästigen, da dies eine DSP-Frage und Antwort ist. Ich bin jedoch verwirrt darüber, welche Algorithmen für die parallele Berechnung von FFTs existieren. Map- und Reduce-Aufgaben können (technisch) nicht miteinander kommunizieren, daher muss die FFT in unabhängige Probleme aufgeteilt werden, aus denen die Ergebnisse am Ende irgendwie wieder zusammengeführt werden können.
Ich habe eine einfache Implementierung von Cooley-Tukey Radix 2 DIT programmiert, die an kleinen Beispielen funktioniert, aber die Verwendung für die rekursive Berechnung von DFTs mit ungeraden / geraden Indizes für eine Milliarde Bytes wird nicht funktionieren. Ich habe ein paar Wochen damit verbracht, viele Artikel zu lesen, darunter einen über einen MapReduce-FFT-Algorithmus (geschrieben von Tsz-Wo Sze als Teil seines Beitrags zur SSA-Multiplikation, ich kann nicht mehr als zwei Hyperlinks verknüpfen) und die "Vier-Schritt-FFT". ( hier und hier), die einander und dem, was ich zu erreichen versuche, ähnlich zu sein scheinen. Ich bin jedoch hoffnungslos schlecht in Mathematik und wende eine dieser Methoden von Hand auf eine einfache Menge von Dingen wie {1,2, 3, 4, 5, 6, 7, 8} an (wobei alle imaginären Komponenten 0 sind) mir wild falsche ergebnisse. Kann mir jemand einen effizienten parallelen FFT-Algorithmus im Klartext erklären (einen, den ich verknüpft habe oder einen anderen), damit ich ihn programmieren kann?
Edit: Jim Clay und jeder andere, der durch meine Erklärung verwirrt sein könnte, ich versuche, eine einzelne FFT der Terabyte-Datei zu machen. Ich möchte es jedoch auf mehreren Servern gleichzeitig ausführen können, um den Vorgang zu beschleunigen.