Функциональное ключевое слово для унифицированного распределения памяти cuda

Я начинаю с программирования CUDA, и в качестве начала реализации интегратора частиц я создал класс интегратора, который хранит данные о частицах и должен иметь возможность их интегрировать. Данные поступают из другого класса контейнера, и я хочу разместить эти данные в объединенной памяти. Для этой цели у меня есть функция-член _allocate, все, что она делает, это вызывает cudaMallocManaged для переменных-членов. Теперь мне было интересно, в какое функциональное ключевое слово я должен заключить эту функцию.

Я читал, что вы не можете использовать "глобальный" в определении класса, прямо сейчас я использую и хост, и устройство, так как единая память должна быть доступна как хосту, так и устройству, но я не уверен, что это правильный путь.

Это класс, в котором я хотел бы реализовать это:


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

Я не знаю, актуально ли это для ключевого слова function, но я также хочу проверить cudaError после выделения, чтобы узнать, было ли оно успешным.

1 ответ

Решение

Каждый вызываемый объект, который может быть вызван только на устройстве, должен быть украшен __device__. и если только хост должен быть украшен__host__.

Ты используешь __host__ __device__ только для вызываемых, которые будут вызываться как на хосте, так и на устройстве.

cudaMallocManaged это код только для хоста:

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

поэтому ваш код может работать только на хосте.

Другие вопросы по тегам