mot-clé fonctionnel pour une allocation mémoire unifiée cuda

voix
0

Je commence avec la programmation CUDA et en début de la mise en œuvre d'un intégrateur de particules, j'ai fait une classe d'intégrateur qui contient des données sur les particules et devrait être en mesure de l'intégrer. Les données proviennent d'une autre classe de conteneur, et je veux affecter ces données sur la mémoire unifiée. A cet effet, j'ai une fonction membre « _allocate », tout ce qu'il fait est d'appeler cudaMallocManaged pour les variables membres. Maintenant, je me demandais dans quel genre de mot-clé fonctionnelle j'envelopper cette fonction.

Je lis que vous ne pouvez pas utiliser « global » dans une définition de classe, en ce moment je suis en utilisant à la fois hôte et périphérique, étant donné que la mémoire unifiée devrait être disponible à la fois hôte et périphérique, mais je ne suis pas sûr que ce soit la bonne façon.

C'est la classe que je voudrais mettre en œuvre ce dans:


template <typename T>
class Leapfrog : public Integrator<T> {
  public:

   ...

  private:
    T *positions; 
    T *masses; 
    T *velocities; 
    T *types; 
    __device__ __host__ bool _allocate();
    __device__ __host__ bool _free();
    __device__ __host__ bool _load_data();
};

// allocates space on the unified memory for the 
// private variables positions, masses, velocities, types

template <typename T>
__host__ __device__ void Leapfrog<T>::_allocate(){
  cudaMallocManaged(&positions, particleset.N*3*sizeof(T));
  cudaMallocManaged(&masses, particleset.N*sizeof(T));
  cudaMallocManaged(&velocities, particleset.N*3*sizeof(T));
  cudaMallocManaged(&types, particleset.N*sizeof(T));
}

Je ne sais pas si cela est pertinent pour le mot-clé fonctionnel, mais je veux également vérifier cudaError après l'attribution pour voir si elle a réussi

Créé 24/10/2019 à 11:57
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
0

Chaque appelable qui peut être appelé sur l' appareil uniquement, doit être décoré avec __device__. et si l' hôte ne doit être décorée avec __host__.

Vous utilisez __host__ __device__uniquement pour appelable qui sera appelé à la fois hôte et périphérique.

cudaMallocManaged est l'hôte uniquement du code:

__host__​cudaError_t cudaMallocManaged ( void** devPtr, size_t size, unsigned int  flags = cudaMemAttachGlobal )
Allocates memory that will be automatically managed by the Unified Memory system.

si votre code ne peut fonctionner sur l'hôte.

Créé 24/10/2019 à 18:42
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more