L'appel d'une fonction à partir de la fonction globale
Comment dois-je acces 'do_sth' fonction "imprimer" de la fonction (voir le code)? Pourquoi il y a " N " (regardez le code) variable/constante visible pour les GPU sans l'aide de cudaMemcpy?
__device__ void do_sth(char *a, int N)
{
int idx = blockIdx.x * blockDim.x + threadIdx.x;
if(idx < N)
{
a[idx] = a[idx];
}
}
__global__ void print(char *a, int N)
{
//question_1: why there is an access to N, it is now in GPU memory, how?
int idx = blockIdx.x * blockDim.x + threadIdx.x;
//do_sth<<<nblock2,blocksize2>>>(a,N); //error_1: a host function call can not be configured
//do_sth(&&a,N); //error_2: expected an expression
if(idx<N)
{
a[idx]=a[idx];
}
}
- Votre question est vague, veuillez préciser
Vous devez vous connecter pour publier un commentaire.
__global__
fonction (aka "noyau") se trouve sur le GPU déjà. Tous ses paramètres (variablesa
etN
) sont transmis par le partage ou la mémoire constante (selon votre type d'appareil) lors de l'appel, de sorte que vous pouvez directement accéder à ces variables. Il y a une limite de paramètres de taille 256B sur la pré-Fermi cartes etde 16 ko(?)4 KO sur Fermi, donc si vous avez de grandes quantités de données à transférer, vous ne pouvez pas évitercudaMemcpy
fonctions.__global__
les paramètres de la fonction ne doit pas être modifié.Lors de l'appel de
__device__
de__global__
vous ne pas spécifier les paramètres de configuration dans le triple crochets. Le__device__
fonction sera appelée par tous les threads qui atteignent l'appel à partir du noyau. Notez que vous pouvez appeler des fonctions de l'intérieurif
états, afin de prévenir certains threads d'exécution.Dans la version actuelle de CUDA, il est impossible de générer davantage de threads en cours d'exécution du noyau.Il n'y a pas de unaire
&&
opérateur dans CUDA C++ (il n'y a rien de tel opérateur normal C++, pas sûr à ce sujet maintenant, quand la nouvelle norme émerge)