Différence entre les niveaux mondial et les fonctions de l'appareil
Quelqu'un peut-il expliquer les différences entre __global__
et __device__
?
Quand dois-je utiliser __device__
, et quand les utiliser __global__
?.
Vous devez vous connecter pour publier un commentaire.
Fonctions globales sont également appelés "grains". C'est les fonctions que vous pouvez appeler à partir de l'hôte à l'aide de CUDA noyau appel à la sémantique (
<<<...>>>
).Fonctions de l'appareil ne peut être appelé à partir d'autres périphériques ou des fonctions globales.
__device__
fonctions ne peuvent pas être appelées à partir de code hôte.__global__
, les fonctions peuvent être appelées à partir de l'appareil à l'aide de CUDA noyau sémantique (<<<...>>>) si vous utilisez le parallélisme dynamique - qui nécessite CUDA 5.0 et de calculer la capacité de 3.5 ou supérieur.Différences entre
__device__
et__global__
fonctions sont:__device__
les fonctions peuvent être appelées qu'à partir de l'appareil, et elle est exécutée uniquement dans l'appareil.__global__
fonctions peuvent être appelées à partir de l'hôte, et il est exécuté dans l'appareil.Donc, vous appelez
__device__
des fonctions à partir de grains de fonctions, et vous n'avez pas de fixer les paramètres du noyau. Vous pouvez aussi surcharger une fonction électronique.g : vous pouvez déclarervoid foo(void)
et__device__ foo (void)
, puis est exécuté sur l'hôte et ne peut être appelé à partir d'une fonction d'hôte. Les autres sont exécutés sur l'appareil et ne peut être appelé à partir d'un appareil ou de la fonction noyau.Vous pouvez également visiter le lien suivant: http://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialDeviceFunctions, il a été utile pour moi.
__global__
- S'exécute sur le processeur graphique, appelé à partir de la CPU ou le GPU*. Exécuté avec<<<dim3>>>
arguments.__device__
- S'exécute sur le processeur graphique, appelé à partir de la GPU. Peut être utilisé avec variabiles trop.__host__
- S'exécute sur le PROCESSEUR, appelé à partir de la CPU.*)
__global__
fonctions peuvent être appelées à partir d'autres__global__
fonctions de départcalculer la capacité de 3.5.
Je vais vous expliquer avec un exemple:
c'est à dire quand nous voulons un hôte(CPU) la fonction à appeler un périphérique(GPU) de la fonction, puis "mondiale " est utilisé. Lire ceci: "https://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialGlobalFunctions"
Et quand on veut un appareil(GPU) fonction (plutôt noyau) pour appeler une autre fonction noyau, nous utilisons des 'appareil'. Lire cette "https://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialDeviceFunctions"
Cela devrait être suffisant pour comprendre la différence.
__global__
est pour les noyaux cuda, les fonctions qui sont disponibles à partir de l'hôte directement.__device__
les fonctions peuvent être appelées à partir de__global__
et__device__
fonctions, mais pas à partir de l'hôte.Je suis l'enregistrement de certaines spéculations infondées ici pour le moment (je vais justifier ces plus tard, quand je viens à travers certaines sources faisant autorité)...
__device__
fonctions peuvent avoir un type de retour autre que le vide, mais__global__
fonctions doivent toujours retourner void.__global__
fonctions peuvent être appelées à partir d'autres noyaux en cours d'exécution sur le processeur graphique de lancer des GPU fils (dans le cadre de CUDA dynamique modèle de parallélisme (aka CNP)), tandis que__device__
fonctions s'exécutent sur le même thread que l'appel noyau.__global__
est un CUDA C mot-clé (déclaration spécificateur) qui dit que la fonction,fonctions globales (noyaux), lancée par le code hôte à l'aide de
<<< no_of_blocks , no_of threads_per_block>>>
.Chaque thread exécute le noyau par son unique id de thread.
Cependant,
__device__
fonctions ne peut pas être appelée à partir de l'hôte de code.si vous avez besoin de faire utiliser à la fois__host__
__device__
.__global__
fonction de la définition de la notion de noyau. Chaque fois qu'il est appelé à partir de la CPU, ce noyau est lancé sur le GPU.Cependant, chaque thread d'exécution d'un noyau, il peut être nécessaire d'exécuter un code encore et encore, par exemple, la permutation de deux nombres entiers. Donc, ici, nous pouvons écrire une fonction d'aide, tout comme nous le faisons dans un programme C. Et pour les threads d'exécution sur GPU, une fonction d'assistance doivent être déclarés comme
__device__
.Ainsi, un fonctionnement de l'appareil est appelé à partir de threads de noyau d'une instance pour un thread . Alors, une fonction globale est appelée à partir de thread CPU.
Global de la Fonction ne peut être appelée à partir de l'hôte et qu'ils n'ont pas de type de retour alors que l'Appareil photo Fonction ne peut être appelée à partir du noyau de la fonction de l'autre Appareil fonction d'où dosen nécessite pas de paramètre du noyau