parola chiave funzionale per un'allocazione CUDA memoria unificata

voti
0

Sto iniziando con programmazione CUDA e come inizio di attuazione di un integratore particella, feci una classe integratore che contiene i dati relativi particelle e dovrebbe essere in grado di integrare. I dati provengono da un'altra classe contenitore, e voglio allocare questi dati nella memoria unificata. A tal fine, ho una funzione membro '_allocate', tutto ciò che fa è chiamare cudaMallocManaged per le variabili membro. Ora mi chiedevo in che tipo di parola chiave funzionale dovrei avvolgere questa funzione.

Ho letto che non è possibile utilizzare 'globale' in una definizione di classe, in questo momento sto usando sia host e il dispositivo, in quanto memoria unificata dovrebbe essere disponibile sia per host e il dispositivo, ma non sono sicuro se questo è il modo corretto.

Questa è la classe mi piacerebbe implementare questo in:


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));
}

Non so se questo è rilevante per la parola chiave funzionale, ma voglio anche controllare cudaError dopo l'assegnazione per vedere se ha avuto successo

È pubblicato 24/10/2019 alle 11:57
fonte dall'utente
In altre lingue...                            


1 risposte

voti
0

Ogni richiamabile che può essere chiamato solo sul dispositivo, dovrebbe essere decorato con __device__. e solo se l'host dovrebbe essere decorato con __host__.

Si utilizza __host__ __device__solo per callable che sarà chiamato sia su host e il dispositivo.

cudaMallocManaged è ospite unico codice:

__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.

modo che il codice può solo lavorare su host.

Risposto il 24/10/2019 a 18:42
fonte dall'utente

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