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

How to handle cudaFree on globally instantiated variables

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

class BitUnpackPtrs
{
public:
    ushort* d_dataIn;

    BitUnpackPtrs() : d_dataIn(NULL) {};

    ~BitUnpackPtrs()
    {
        cudaFree(d_dataIn);
    }

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

将class全局实例化为句柄,减少cuda内存的频繁分配。但是,当我的程序终止时,cuda-memcheck 会产生警告:

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

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

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

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

另一种方法是使用 std::shared_ptrcustom deleter,这会调用 cudaFree()。如果你这样做,那么 cudaFree() 调用将在最后一个 "user" 破坏其共享指针的副本之后发生——这是在 main() 完成之前和 CUDA 拆卸之前。