gpt4 book ai didi

c++ - 如何在全局实例化变量上处理 cudaFree

转载 作者:行者123 更新时间:2023-11-30 03:33:03 30 4
gpt4 key购买 nike

我有一个用于实例化全局变量的类:

class BitUnpackPtrs
{
public:
ushort* d_dataIn;

BitUnpackPtrs() : d_dataIn(NULL) {};

~BitUnpackPtrs()
{
cudaFree(d_dataIn);
}

void update(...) { ... }
};

该类被全局实例化为句柄,以减少cuda内存的频繁分配。但是,当我的程序终止时,cuda-memcheck 会发出警告:

Program hit cudaErrorCudartUnloading (error 29) due to "driver shutting down" on CUDA API call to cudaFree.

处理这个问题的正确方法是什么?我可以删除 cudaFree,但如果稍后在非全局级别使用此类,则会导致内存泄漏。我可以在构造函数中使用标志来指示应如何处理内存。

或者,有没有一种方法可以检测 cuda 驱动程序是否正在关闭并且在该实例中不调用 cudaFree?

最佳答案

不要将此对象设置为全局对象,而是在您的 main() 函数(或被 main() 调用并包装应用程序的整个执行过程的某个地方)实例化它).这将确保您的 cudaFree() 调用在 CUDA 拆卸发生之前被调用。

另一种选择是使用带有 custom deleterstd::shared_ptr ,它调用 cudaFree()。如果你这样做,那么 cudaFree() 调用将在最后一个“用户”销毁其共享指针的拷贝之后发生——这是在 main() 完成之前并且在 CUDA 拆解之前。

关于c++ - 如何在全局实例化变量上处理 cudaFree,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43235548/

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