【发布时间】:2017-08-31 07:48:23
【问题描述】:
我有一个用于实例化全局变量的类:
class BitUnpackPtrs
{
public:
ushort* d_dataIn;
BitUnpackPtrs() : d_dataIn(NULL) {};
~BitUnpackPtrs()
{
cudaFree(d_dataIn);
}
void update(...) { ... }
};
该类被全局实例化为句柄,以减少 cuda 内存的频繁分配。但是,当我的程序终止时,cuda-memcheck 会产生警告:
由于对 cudaFree 的 CUDA API 调用“驱动程序关闭”,程序命中 cudaErrorCudartUnloading(错误 29)。
处理这个问题的正确方法是什么?我可以删除 cudaFree,但如果稍后在非全局级别使用此类,则会导致内存泄漏。我可以在构造函数中使用一个标志来指示应该如何处理内存。
或者,有没有办法检测 cuda 驱动程序是否正在关闭并且在这种情况下不调用 cudaFree?
【问题讨论】:
-
不要在构造函数或析构函数中实例化期望调用或必须调用 cuda 运行时 API 函数的类的全局对象。 CUDA 运行时初始化/拆卸可以在程序启动和关闭时对此造成严重破坏,具体取决于您在类构造函数和析构函数中所做的事情。无法检测 cuda 驱动程序是否正在关闭(以不会在
cuda-memcheck中标记的方式)并且在这种情况下不调用cudaFree。
标签: c++ cuda global-variables dynamic-memory-allocation