gpt4 book ai didi

c++ - 通过复制将对象传递给 CUDA 内核会调用其析构函数并过早释放内存

转载 作者:行者123 更新时间:2023-11-30 05:08:09 26 4
gpt4 key购买 nike

我有一个 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 元素是。

最佳答案

您的析构函数总是删除 data 指针。但是,默认复制构造函数将拥有原始对象的 data 指针的拷贝,它不得删除。

解决此问题的一种方法是修改您的类以持有一个标志,该标志表明 data 指针是否由该类拥有并且需要删除。然后定义一个复制构造函数来适本地设置该标志。

如果拷贝比原始对象长,则此方法存在潜在问题,并且还应添加移动构造函数。然后是复制赋值和移动赋值运算符。参见 this answer获取更多信息。

关于c++ - 通过复制将对象传递给 CUDA 内核会调用其析构函数并过早释放内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46978558/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com