小编Bo *_* Li的帖子

cuda 调用在析构函数中失败

我是 CUDA 新手,在使用 CUDA 编写单例/全局变量时遇到问题。单例分配一些 cuda 内存并尝试在析构函数中释放它。但是,析构函数因 cudaError 29“驱动程序关闭”而崩溃。

通过一些搜索,我注意到原因可能是在程序退出后、当 CUDA 已经关闭时调用单例析构函数。

https://github.com/NVlabs/SASSI/issues/4 当在静态成员的析构函数中调用 cuda 函数时,此链接报告了类似的问题。

https://devtalk.nvidia.com/default/topic/457922/cudafree-crash-in-destructor-when-exit-is- Called/ 此链接报告了相同的问题和不清楚的解决方案。

老实说,我没有太多的 CUDA 知识,所以我想请求一些详细的解释和正式的解决方案来解决这个问题。

编辑:

感谢@Robert Crovella 的提醒,我做了一些测试来重现该问题。好的,我发现这个问题发生在 std::unordered_map 或 std::map 的单例变量和全局变量中,这些变量在其值对象的析构函数中调用 cuda。

工作代码,未使用 std::map:

#include <iostream>
#include <map>

#define CUDA_CHECK(x) std::cerr << (x) << std::endl;

class cuda_user
{   
    char* data;
public:
    cuda_user() {
        std::cerr << "constr" << std::endl;
        CUDA_CHECK(cudaMalloc((void**)&data, 1024));
    }
    void foo() {
        std::cerr << "foo" << std::endl;
    };
    ~cuda_user() {
        std::cerr << "destr"  << std::endl;
        CUDA_CHECK(cudaFree(data));
    }
};

cuda_user …
Run Code Online (Sandbox Code Playgroud)

c++ singleton stl cuda

3
推荐指数
1
解决办法
2702
查看次数

标签 统计

c++ ×1

cuda ×1

singleton ×1

stl ×1