Я начинаю с программирования 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 после выделения, чтобы убедиться, что оно прошло успешно