通过复制将对象传递给 CUDA 内核会调用其析构函数并过早释放内存
Passing an object to CUDA kernel by copy invokes its destructor and releases memory prematurely
我有一个使用 cudaMallocManaged
分配data
的GPUMatrix
类:
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
元素是。
析
构函数始终删除data
指针。 但是,默认复制构造函数将具有原始对象的data
指针的副本,它不得删除该副本。
解决此问题的一种方法是修改类以保存一个标志,该标志指示data
指针是否归该类所有并需要删除。 然后定义一个复制构造函数来适当地设置该标志。
如果副本的寿命超过原始对象,则此方法存在潜在问题,并且还应添加移动构造函数。 然后是复制赋值和移动赋值运算符。 有关详细信息,请参阅此答案。
相关文章:
- 析构函数调用
- 在具有向量的类构造函数中进行析构函数调用
- 从 c++ 中派生类的析构函数调用虚函数
- C++析构函数调用两次,堆栈分配的复合对象
- C++ 在析构函数调用之前删除的动态成员数组
- 析构函数调用c++中的一个向量
- Singleton模式中的手动析构函数调用:调用多次
- 从内部类的析构函数调用虚拟函数
- 与 boost odeint 集成期间的析构函数调用
- 堆栈展开如何与析构函数调用有关?
- C++:优化析构函数调用
- 以逗号分隔的表达式中的析构函数调用
- GCC 9.1 返回 void& 作为显式析构函数调用的结果类型。这是一个错误吗?
- 从C++中的虚拟析构函数调用虚拟方法
- 从指针返回对象时出现意外的析构函数调用
- 使用 decltype 显式析构函数调用
- C++析构函数调用了错误的对象
- 了解虚拟函数和析构函数调用
- 多重继承析构函数调用他自己和父析构函数?c++
- 析构函数调用表单不适当的库