统一内存分配cuda的功能关键字
Functional keyword for a unified memory allocation cuda
我开始使用 CUDA 编程,作为实施粒子积分器的开始,我制作了一个积分器 class,它保存有关粒子的数据并且应该能够对其进行积分。数据来自另一个容器class,我想把这个数据分配到统一内存上。为此,我有一个成员函数“_allocate”,它所做的只是为成员变量调用 cudaMallocManaged。现在我想知道我应该用什么样的函数关键字来包装这个函数。
我读到你不能在 class 定义中使用 'global',现在我同时使用主机和设备,因为主机和设备应该都可以使用统一内存,但是我'我不确定这是不是正确的方法。
这是 class 我想在以下位置实施:
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));
}
我不知道这是否与functional关键字有关,但我也想在分配后检查cudaError看是否成功
每个只能在设备上调用的可调用对象都应该用__device__
修饰。如果 host only 应该用 __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.
因此您的代码只能在主机上运行。
我开始使用 CUDA 编程,作为实施粒子积分器的开始,我制作了一个积分器 class,它保存有关粒子的数据并且应该能够对其进行积分。数据来自另一个容器class,我想把这个数据分配到统一内存上。为此,我有一个成员函数“_allocate”,它所做的只是为成员变量调用 cudaMallocManaged。现在我想知道我应该用什么样的函数关键字来包装这个函数。
我读到你不能在 class 定义中使用 'global',现在我同时使用主机和设备,因为主机和设备应该都可以使用统一内存,但是我'我不确定这是不是正确的方法。
这是 class 我想在以下位置实施:
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));
}
我不知道这是否与functional关键字有关,但我也想在分配后检查cudaError看是否成功
每个只能在设备上调用的可调用对象都应该用__device__
修饰。如果 host only 应该用 __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.
因此您的代码只能在主机上运行。