Différence entre les fonctions globales et de périphérique


65

Quelqu'un peut-il décrire les différences entre __global__ et __device__? Quand dois-je utiliser __device__ et quand utiliser __global__?

93

Les fonctions globales sont également appelées "noyaux". Ce sont les fonctions que vous pouvez appeler du côté de l'hôte en utilisant la sémantique des appels du noyau CUDA (<<<...>>>).

Les fonctions de l'appareil peuvent uniquement être appelées depuis un autre périphérique ou des fonctions globales. __device__ Les fonctions ne peuvent pas être appelées à partir du code hôte.

+7

Tout comme un additif, 'fonctions __global__' peut également être appelé depuis l'appareil en utilisant la sémantique du noyau CUDA (<<<...> >>) si vous utilisez le parallélisme dynamique - qui nécessite CUDA 5.0 et une capacité de calcul 3.5 ou supérieur. 11 sept.. 122012-09-11 17:44:18


10

__global__ est pour les noyaux cuda, fonctions qui peuvent être appelées directement par l'hôte. Les fonctions __device__ peuvent être appelées depuis les fonctions __global__ et __device__ mais pas depuis l'hôte.


28

Différences entre __device__ et __global__ fonctions sont:

__device__ fonctions peuvent être appelées uniquement à partir du dispositif, et il est exécuté que dans l'appareil.

__global__ Les fonctions peuvent être appelées à partir de l'hôte et elles sont exécutées dans le périphérique. Par conséquent, vous appelez __device__ fonctions à partir des fonctions du noyau, et vous n'avez pas besoin de définir les paramètres du noyau. Vous pouvez également "surcharger" une fonction, par exemple: vous pouvez déclarer void foo(void) et __device__ foo (void), puis l'une est exécutée sur l'hôte et ne peut être appelée qu'à partir d'une fonction hôte. L'autre est exécuté sur le périphérique et ne peut être appelé qu'à partir d'une fonction de périphérique ou de noyau.

Vous pouvez également visiter le lien suivant: http://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialDeviceFunctions, c'était utile pour moi.


12

Je vais vous expliquer avec un exemple:

main() 
{ 
    // Your main function. Executed by CPU 
} 

__global__ void calledFromCpuForGPU(...) 
{ 
    //This function is called by CPU and suppose to be executed on GPU 
} 

__device__ void calledFromGPUforGPU(...) 
{ 
    // This function is called by GPU and suppose to be executed on GPU 
} 

à savoir quand nous voulons une fonction fonction hôte (CPU) pour appeler un dispositif (GPU), puis ' global' est utilisé. Lisez ceci: « https://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialGlobalFunctions »

Et quand nous voulons un dispositif (GPU) fonction (noyau plutôt) pour appeler une autre fonction du noyau que nous utilisons « appareil ». Lire ceci "https://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialDeviceFunctions"

Cela devrait être suffisant pour comprendre la différence.


5

__global__ La fonction est la définition du noyau. Chaque fois qu'il est appelé depuis le CPU, ce noyau est lancé sur le GPU. Cependant, chaque thread exécutant ce noyau peut avoir besoin d'exécuter encore et encore du code, par exemple l'échange de deux entiers. Ainsi, nous pouvons écrire ici une fonction d'aide, tout comme nous le faisons dans un programme en C. Et pour les threads s'exécutant sur GPU, une fonction d'assistance doit être déclarée comme __device__.

Ainsi, une fonction de périphérique est appelée à partir de threads d'un noyau - une instance pour un thread. Pendant ce temps, une fonction globale est appelée depuis le thread CPU.


6

J'enregistre quelques spéculations non fondées ici pour le moment (je justifier ces plus tard quand je tombe sur une source faisant autorité) ...

  1. fonctions __device__ peuvent avoir un type de retour autre que vide, mais __global__ Les fonctions doivent toujours retourner void.

  2. __global__ fonctions peuvent être appelées à partir d'autres noyaux en cours d'exécution sur le GPU pour lancer les discussions GPU supplémentaires (dans le cadre du modèle de parallélisme dynamique CUDA (aka CNP)) tandis que __device__ fonctions fonctionnent sur le même thread que le noyau d'appel.


2

fonction globale ne peut être appelé à partir de l'hôte et ils n'ont pas un type de retour en fonction de l'appareil ne peut être appelé à partir de la fonction du noyau d'une autre fonction de l'appareil où doesnt nécessitent la mise en noyau


5

__golbal__ est un mot-clé CUDA C (spécificateur de déclaration) qui dit que le code de la fonction,

  1. sur l'appareil Exécute (GPU)
  2. appels d'hôte (CPU).

fonctions globales (noyaux) lancés par le code hôte en utilisant < < < no_of_blocks, no_of threads_per_block >>>. Chaque thread exécute le noyau par son identifiant de thread unique.

Mais __device__ fonctions ne peuvent pas être appelées à partir hôte code.if vous devez le faire utiliser les deux __host____device__


11
  1. __global__ - Fonctionne sur le GPU, appelé de la CPU. Exécuté avec <<<dim3>>> arguments.
  2. __device__ - Fonctionne sur le GPU, appelé depuis le GPU. Peut être utilisé avec des variabilités aussi.
  3. __host__ - Fonctionne sur la CPU, appelée depuis la CPU.
+1

Cette réponse est un peu trop tardive - c'était correct au moment où la question a été posée, mais elle n'est plus correcte depuis l'invention du [parallélisme dynamique] (https://devblogs.nvidia.com/parallelforall/introduction-cuda -dynamic-parallelism /). 12 sept.. 162016-09-12 11:47:03