palavra-chave funcional para um cuda alocação de memória unificada

votos
0

Estou começando com programação CUDA e como um início para a implementação de um integrador de partículas, eu fiz uma classe integrador que mantém dados sobre partículas e deve ser capaz de integrá-lo. Os dados são de outra classe recipiente, e eu quero alocar esses dados na memória unificada. Para este fim, eu tenho uma função de membro '_allocate', tudo que faz é chamar cudaMallocManaged para as variáveis ​​de membro. Agora eu queria saber em que tipo de palavra-chave funcional I deve envolver esta função.

Eu li que você não pode usar 'global' em uma definição de classe, agora eu estou usando tanto host eo dispositivo, uma vez que a memória unificada deve estar disponível para ambos host e dispositivo, mas eu não tenho certeza se este é o caminho correto.

Esta é a classe que eu gostaria de implementar isso em:


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

Eu não sei se isso é relevante para a palavra-chave funcional, mas eu também querer verificar cudaError após a destinação para ver se ele foi bem sucedida

Publicado 24/10/2019 em 11:57
fonte usuário
Em outras línguas...                            


1 respostas

votos
0

Cada exigível que pode ser chamado somente no dispositivo, deve ser decorado com __device__. e se acolhimento só deve ser decorado com __host__.

Você usa __host__ __device__apenas para exigível que será chamado em ambos host e dispositivo.

cudaMallocManaged é anfitrião único código:

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

para que o seu código só pode trabalhar em host.

Respondeu 24/10/2019 em 18:42
fonte usuário

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