2015-10-28 3 views
1

Je tente d'exécuter l'implémentation FFT halogénure trouvé here pour l'analyse comparative contre FTTW. Je suis capable de lancer l'implémentation telle quelle, mais j'ai rencontré quelques problèmes en creusant un peu plus loin. La routine échoue avec des erreurs pour différentes valeurs de H et W (la hauteur et la largeur de l'image d'entrée aléatoire). Par exemple, je reçois l'erreur suivante avec H = W = 5:Bogues de mise en œuvre de FIDE Halide?

Error at ./fft.cpp:603: Cannot vectorize dimension n0 of function v_S1_R5$6 because the function is scheduled inline. Aborted (core dumped)

Je suis tenté de tester sur les petites tailles d'image (par exemple 5x5) pour comparer les résultats des algorithmes, mais je ne peux N'obtenez pas l'algorithme pour toutes les valeurs inférieures à 16, ce qui, même à ce moment-là, fait de la vérification des valeurs une tâche longue. La FFT échoue également pour les valeurs supérieures à 32, ne fonctionnant apparemment pas pour tous les non-pouvoirs de 2.

Quelqu'un at-il déjà rencontré ce problème? Y a-t-il d'autres implémentations de FFT en halogénure qui fonctionnent pour des images de tailles différentes?

Pour référence, je cours le code sur RHEL7 en utilisant gcc 4.8.3.

Répondre

2

Je pense qu'il y a quelques problèmes en cours. Tout d'abord, il semble y avoir un bug pour les très petites FFT n'utilisant qu'un seul passage. Je pense que c'est ce que vous avez touché dans votre premier cas. Le deuxième problème est que W et H doivent être un multiple de la taille du vecteur de votre cible, pas nécessairement que W et H doivent être une puissance de 2. Par exemple, W = 48, H = 32 semble travailler pour moi. Une autre complication est que pour les FFT réelles, une dimension est divisée en deux (c'est la façon dont les FFT réelles sont implémentées), donc si vous êtes sur une machine AVX, cette dimension doit être un multiple de 16 (2x la largeur du vecteur 8 flotteurs).

Si vous souhaitez exécuter des FFT très petites, vous pouvez supprimer les directives de programmation vectorize, alors cela devrait fonctionner, au moins à des fins d'apprentissage.

Cependant, je tiens à souligner que l'exécution de 5x5 ne sera pas très intéressante, car elle se fera en un seul passage de 5 radix, c'est-à-dire juste une simple DFT (cela semble également être cassé, a trouvé). 4x4 (factorisé en 2 radix 2 passages) sera le plus petit FFT intéressant. Lors du débogage, j'ai souvent utilisé des FFT 8x8 (radix 4, radix 2).