136 votes

Différence entre les fonctions globales et les fonctions de dispositif

Quelqu'un peut-il décrire les différences entre __global__ y __device__ ?

Quand dois-je utiliser __device__ et quand l'utiliser __global__ ?.

8voto

Lorin Ahmed Points 49

__global__ est la définition du noyau. Chaque fois qu'elle est appelée depuis le CPU, ce noyau est lancé sur le GPU.

Cependant, chaque thread exécutant ce noyau peut avoir besoin d'exécuter certains codes encore et encore, par exemple l'échange de deux entiers. Ainsi, ici, nous pouvons écrire une fonction d'aide, tout comme nous le faisons dans un programme C. Et pour les threads s'exécutant sur le GPU, une fonction d'aide doit être déclarée comme suit __device__ .

Ainsi, une fonction de périphérique est appelée depuis les threads d'un noyau - une instance pour un thread . Alors qu'une fonction globale est appelée par un thread de l'unité centrale.

7voto

Sandeep Datta Points 7344

J'enregistre ici quelques spéculations non fondées pour l'instant (je les étayerai plus tard lorsque je tomberai sur une source faisant autorité)...

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

  2. __global__ peuvent être appelées depuis d'autres noyaux s'exécutant sur le GPU pour lancer des threads GPU supplémentaires (dans le cadre du modèle de parallélisme dynamique CUDA (alias CNP)) tandis que les fonctions __device__ s'exécutent sur le même thread que le noyau appelant.

7voto

__global__ est un mot-clé CUDA C (spécificateur de déclaration) qui indique que la fonction ,

  1. Exécution sur le dispositif (GPU)
  2. Appels du code hôte (CPU).

les fonctions globales (noyaux) lancées par le code hôte à l'aide de <<< no_of_blocks , no_of threads_per_block>>> . Chaque thread exécute le noyau par son identifiant unique.

Cependant, __device__ ne peuvent pas être appelées depuis le code hôte. Si vous devez le faire, utilisez les deux fonctions suivantes __host__ __device__ .

2voto

harishbisht29 Points 57

Les fonctions globales ne peuvent être appelées que depuis l'hôte et n'ont pas de type de retour, tandis que les fonctions de périphérique ne peuvent être appelées que depuis une fonction du noyau d'une autre fonction de périphérique et ne nécessitent donc pas de paramétrage du noyau.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X