J'essaie de paralléliser le calcul d'une FFT sur des fichiers de signaux de taille téraoctet. À l'heure actuelle, une telle FFT utilisant une bibliothèque open-source prend de nombreuses heures, même en passant par CUDA sur le GPU le plus rapide que j'ai. Le cadre que j'essaie d'adapter à ce processus est Hadoop. En termes très basiques, Hadoop distribue un problème sur n'importe quel nombre de nœuds de serveur de la manière suivante:
• Vous divisez votre fichier d'entrée en paires (clé, valeur).
• Ces paires sont introduites dans un algorithme de «carte», qui transforme vos paires (clé, valeur) en d'autres paires (clé, valeur) en fonction de ce que vous mettez à l'intérieur de la carte.
• Le cadre collecte ensuite toutes les sorties (clé, valeur) des cartes et les trie par clé, ainsi que l'agrégation des valeurs avec la même clé en une seule paire, de sorte que vous vous retrouvez avec (clé, liste (valeur1, valeur2, ..)) paires
• Ces paires sont ensuite introduites dans un algorithme «Réduire», qui à son tour génère plus de paires (clé, valeur) comme résultat final (écrit dans un fichier).
Il existe de nombreuses applications pour ce modèle dans des trucs pratiques comme le traitement des journaux de serveur, mais j'ai du mal à appliquer le cadre pour découper une FFT en «cartographier» et «réduire» les tâches, d'autant plus que je ne suis pas vraiment familier avec DSP.
Je ne vais pas vous déranger avec le jumbo de programmation mumbo, car il s'agit d'un Q&A DSP. Je suis cependant confus sur les algorithmes qui existent pour calculer les FFT en parallèle; Les tâches de cartographie et de réduction ne peuvent pas (techniquement) communiquer entre elles, la FFT doit donc être divisée en problèmes indépendants à partir desquels les résultats peuvent en quelque sorte être recombinés à la fin.
J'ai programmé une implémentation simple de Cooley-Tukey Radix 2 DIT qui fonctionne sur de petits exemples, mais en l'utilisant pour calculer récursivement les DFT d'indice impair / pair pour un milliard d'octets ne fonctionnera pas. J'ai passé quelques semaines à lire de nombreux articles, dont un sur un algorithme MapReduce FFT (écrit par Tsz-Wo Sze dans le cadre de son article sur la multiplication SSA, je ne peux pas lier plus de 2 hyperliens) et la «FFT en quatre étapes» ( ici et ici), qui semblent similaires les uns aux autres et à ce que j'essaie d'accomplir. Cependant, je suis désespérément mauvais en mathématiques, et appliquer l'une de ces méthodes à la main à un simple ensemble de quelque chose comme {1,2, 3, 4, 5, 6, 7, 8} (avec tous les composants imaginaires étant 0) donne moi des résultats extrêmement incorrects. Quelqu'un peut-il m'expliquer un algorithme FFT parallèle efficace en anglais simple (celui que j'ai lié ou tout autre) afin que je puisse essayer de le programmer?
Edit: Jim Clay et toute autre personne qui pourrait être confuse par mon explication, j'essaie de faire une seule FFT du fichier téraoctet. Mais je veux pouvoir le faire simultanément sur plusieurs serveurs afin d'accélérer le processus.