【发布时间】:2017-10-28 00:08:53
【问题描述】:
我有一个GPUMatrix 类,使用data 分配cudaMallocManaged:
class GPUMatrix
{
public:
GPUMatrix() { };
GPUMatrix(int rows, int cols, unsigned flags = 0) { cudaMallocManaged(data) ... };
~GPUMatrix() { cudaFree(data) ... };
public:
int rows = 0;
int cols = 0;
float *data = nullptr;
};
GPU 只能访问 data 指针。因此,我像这样定义我的 mat mul 内核(它需要对象的副本):
__global__
void MatMulNaiveKernelMat(const GPUMatrix a, const GPUMatrix b, const GPUMatrix c)...
在完成后它会调用~GPUMatrix() 并释放内存。处理这个问题的最佳方法是什么?我无法将指向 GPUMatrix 的指针或引用传递给内核,因为整个对象不是由 cudaMallocManaged 分配的,只有 data 元素是。
【问题讨论】:
-
不要在默认构造函数或析构函数中调用CUDA API
-
我当然可以这样做,但是我必须有一个
Init、Release对方法对吗?并且必须记住给它们打电话,否则会冒着内存泄漏的风险,这似乎很不方便。还是您有其他建议?