2015-11-25 2 views
0

Je commence à porter une application fftw3 existante pour utiliser les bibliothèques cuda fftw. L'étape initiale consiste simplement à remplacer l'en-tête fftw3.h par l'en-tête cufft.h et à lier les bibliothèques de cufft au lieu des bibliothèques fftw3.Déboguer la création du plan d'interface CUFFTW

C'est assez simple, et le code compile avec nvcc. Cependant, lorsque j'exécute le code, l'application est incapable de créer un plan à l'aide de la commande fftw_plan_guru_dft (elle renvoie simplement 0 au lieu d'un plan valide).

Puisqu'il n'y a aucune erreur signalée je ne sais pas comment je pourrais déboguer ce problème. cuda-gdb et gdb ne fournissent aucune information supplémentaire. Ils signalent simplement

Error: Internal error reported by CUDA debugger API (error=7). The application cannot be further debugged. 

MISE À JOUR: Voici donc l'exemple de travail minimum. Comme mentionné dans mon commentaire à Talonmies, ce code est autogénéré par un solveur d'équations différentielles scientifique. Alors, s'il vous plaît excuser les noms de fonction, etc.

#define real Re 
#define imag Im 

#include <complex> 

#undef real 
#undef imag 

#include <cufftw.h> 

#include <stdio.h> 

int main(void) { 
    int _transform_sizes_index = 1, _loop_sizes_index = 0; 
    fftw_iodim _transform_sizes[1], _loop_sizes[2]; 
    _transform_sizes[0].n = 128; 
    _transform_sizes[0].is = 0; 
    _transform_sizes[0].os = 0; 

    fftw_complex _data_in[128] = {0.}; 

    static fftw_plan _fftw_forward_plan = NULL; 
    _fftw_forward_plan = fftw_plan_guru_dft(
      _transform_sizes_index, _transform_sizes, 
      _loop_sizes_index, _loop_sizes, 
      reinterpret_cast<fftw_complex*>(_data_in), 
      reinterpret_cast<fftw_complex*>(_data_in), 
      FFTW_FORWARD, FFTW_PATIENT); 
    if (!_fftw_forward_plan) 
     printf("Error: Unable to create forward plan\n"); 

    return 0; 
} 

moins que quelqu'un d'autre sait ce que je fais mal, il semble que cette fonctionnalité particulière de fftw3 ne peut pas être pris en charge par cufftw.

+2

Pouvez-vous faire un cas de repro pour cela? Sinon, il est très difficile de savoir quel genre de réponse vous attendez ici (ou ce que vous demandez vraiment) – talonmies

+0

Très bien, je vais voir ce que je peux faire. Le code d'origine est généré automatiquement à partir d'un solveur d'équations différentielles scientifique (xmds.org), donc c'est un peu le bordel. Je cherche juste des idées sur le point de départ étant donné que fftw_plan_guru_dft ne génère aucune erreur. – inJeans

+1

FYI: vous pouvez voir [ici] (http://docs.nvidia.com/cuda/cufft/#fftw-supported-interface) que 'fftw_plan_guru_dft()' n'est que partiellement pris en charge dans cuFFT. Êtes-vous sûr que votre cas d'utilisation est pris en charge? – talonmies

Répondre

0

En tant que talonmies souligné, le fftw_plan_guru_dft a seulement un support partiel dans la bibliothèque de cufftw. L'exemple ci-dessus sera exécuté si vous utilisez plutôt le niveau de base fftw_plan_dft. Plus concrètement

#define real Re 
#define imag Im 

#include <complex> 

#undef real 
#undef imag 

#include <cufftw.h> 

#include <stdio.h> 

int main(void) { 
    int _transform_sizes_index = 1, _loop_sizes_index = 0; 
    int _transform_sizes[1] = {128}; 

    fftw_complex _data_in[128] = {0.}; 

    static fftw_plan _fftw_forward_plan = NULL; 
    _fftw_forward_plan = fftw_plan_dft(
      _transform_sizes_index, _transform_sizes, 
      reinterpret_cast<fftw_complex*>(_data_in), 
      reinterpret_cast<fftw_complex*>(_data_in), 
      FFTW_FORWARD, FFTW_PATIENT); 
    if (!_fftw_forward_plan) 
     printf("Error: Unable to create forward plan\n"); 

    return 0; 
}