我是 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)