web-dev-qa-db-fra.com

CUDA et cours

J'ai cherché partout pour savoir comment utiliser exactement les classes avec CUDA, et bien qu'il y ait un consensus général sur le fait que cela peut être fait et semble être fait par des gens, j'ai eu du mal à trouver comment réellement fais le.

J'ai une classe qui implémente un jeu de bits de base avec surcharge d'opérateur et autres. J'ai besoin de pouvoir instancier des objets de cette classe sur l'hôte et le périphérique, copier entre les deux, etc. Dois-je définir cette classe dans un .cu? Si c'est le cas, comment 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 comme threadId; il doit juste pouvoir être utilisé côté hôte et côté appareil.

Merci pour toute aide, et si j'aborde complètement la question, j'aimerais entendre des alternatives.

37
secshunayt

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 de périphérique doit être définie avec les deux __device__ et __Host__ declspecs, y compris le constructeur et le destructeur si vous prévoyez d'utiliser new/delete sur le périphérique (notez que new/delete nécessite CUDA 4.0 et un capacité de calcul 2.0 ou supérieure GPU).

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 sait __device__ et __Host__ - votre compilateur Host C++ générera une erreur.

Note éditée __CUDACC__ est défini par NVCC lors de la compilation des fichiers CUDA . Cela peut être lors de la compilation d'un fichier .cu avec NVCC ou lors de la compilation de n'importe quel fichier avec l'option de ligne de commande -x cu.

54
harrism

Une autre bonne ressource pour cette question est quelques-uns des exemples de code fournis avec la boîte à outils CUDA. Dans ces exemples de code, vous pouvez trouver des exemples de tout ce que vous pourriez imaginer. Celui qui est pertinent pour votre question est le fichier quadtree.cu. Bonne chance.

3
t. fochtman