42 votes

CUDA et les classes

J'ai cherché un peu partout comment utiliser les classes avec CUDA, et bien qu'il y ait un consensus général sur le fait que c'est possible et apparemment fait par des gens, j'ai eu du mal à trouver comment le faire réellement.

J'ai une classe qui implémente un jeu de bits de base avec surcharge d'opérateurs et autres. Je dois être en mesure d'instancier des objets de cette classe à la fois sur l'hôte et sur le périphérique, de les copier entre les deux, etc. Dois-je définir cette classe dans un fichier .cu ? Si oui, comment puis-je l'utiliser dans mon code C++ côté hôte ? Les fonctions de la classe n'ont pas besoin d'accéder à des variables CUDA spéciales telles que threadId ; elles doivent simplement pouvoir être utilisées côté hôte et côté périphérique.

Merci pour toute aide, et si je n'ai pas la bonne approche, j'aimerais entendre d'autres solutions.

58voto

harrism Points 9770

Définissez la classe dans un en-tête que vous #incluez, comme en C++.

Toute méthode qui doit être appelée à partir du code du dispositif doit être définie avec les deux éléments suivants __device__ y __host__ declspecs, y compris le constructeur et le destructeur si vous prévoyez d'utiliser new / delete sur l'appareil (note new / delete nécessitent CUDA 4.0 et un GPU de capacité de calcul 2.0 ou supérieure).

Vous voulez probablement définir une macro comme

#ifdef __CUDACC__
#define CUDA_CALLABLE_MEMBER __host__ __device__
#else
#define CUDA_CALLABLE_MEMBER
#endif 

Utilisez ensuite cette macro sur vos fonctions membres

class Foo {
public:
    CUDA_CALLABLE_MEMBER Foo() {}
    CUDA_CALLABLE_MEMBER ~Foo() {}
    CUDA_CALLABLE_MEMBER void aMethod() {}
};

La raison en est que seul le compilateur CUDA connaît __device__ y __host__ -- le compilateur C++ de votre hôte lèvera une erreur.

Edit : Note __CUDACC__ est défini par NVCC lorsqu'il compile les fichiers CUDA. . Cela peut se faire soit lors de la compilation d'un fichier .cu avec NVCC, soit lors de la compilation de n'importe quel fichier avec l'option de ligne de commande -x cu .

3voto

vertere Points 50

Les exemples de code fournis avec la boîte à outils CUDA constituent une autre bonne ressource pour cette question. Dans ces exemples de code, vous pouvez trouver des exemples d'à peu près tout ce que vous pouvez imaginer. Le fichier quadtree.cu est un exemple pertinent pour votre question. Bonne chance.

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