Функциональное ключевое слово для унифицированного распределения памяти cuda - PullRequest
1 голос
/ 24 октября 2019

Я начинаю с программирования 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));
}

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

1 Ответ

0 голосов
/ 24 октября 2019

Каждый вызываемый объект, который может быть вызван только на устройстве, должен быть отмечен __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.

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

...