Функциональное ключевое слово для унифицированного распределения памяти 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.
поэтому ваш код может работать только на хосте.