CUDA C++ Template de Paramètre de Noyau

Je suis en train de templatize un CUDA noyau basé sur une variable booléenne (comme illustré ici: Dois-je unifier les deux noyaux avec un "si", déclaration, au risque de perte de performance?), mais je reçois une erreur de compilateur qui dit que ma fonction n'est pas un modèle. Je pense que je suis juste en manque de quelque chose d'évident donc c'est assez frustrant.

Le code suivant ne fonctionne PAS:

util.cuh

#include "kernels.cuh"
//Utility functions

noyaux.cuh

    #ifndef KERNELS
    #define KERNELS
    template<bool approx>
    __global__ void kernel(...params...);
    #endif

noyaux.cu

template<bool approx>
__global__ void kernel(...params...)
{
    if(approx)
    {
       //Approximate calculation
    }
    else
    {
      //Exact calculation
    }
}

template __global__ void kernel<false>(...params...); //Error occurs here

principal.cu

#include "kernels.cuh"
kernel<false><<<dimGrid,dimBlock>>>(...params...);

Le code suivant fonctionne:

util.cuh

#include "kernels.cuh"
//Utility functions

noyaux.cuh

#ifndef KERNELS
#define KERNELS
template<bool approx>
__global__ void kernel(...params...);
template<bool approx>
__global__ void kernel(...params...)
{
    if(approx)
    {
       //Approximate calculation
    }
    else
    {
      //Exact calculation
    }
}
#endif

principal.cu

#include "kernels.cuh"
kernel<false><<<dimGrid,dimBlock>>>(...params...);

Si je jette dans la

template __global__ void kernel<false>(...params...);

ligne à la fin de grains.cuh il fonctionne également.

J'obtiens les erreurs suivantes (les deux se référant à la ligne marquée ci-dessus):

kernel is not a template
invalid explicit instantiation declaration

Si cela fait une différence, je compile tout mon .cu fichiers en une seule ligne, comme:

nvcc -O3 -arch=sm_21 -I. main.cu kernels.cu -o program

OriginalL'auteur Adam27X | 2013-11-08