由于我怀疑“黑匣子”(GPU)在某些较大的代码(可能还有其他代码)中没有完全关闭,因此我会cudaDeviceReset()在main(). 可是等等!这将在析构函数Segmentation fault中main()使用非平凡的 CUDA 代码静态创建的所有类实例,对吗?例如
class A {
public:
cudaEvent_t tt;
cudaEvent_t uu;
A() {
cudaEventCreate(&tt);
cudaEventCreate(&uu);
}
~A(){
cudaEventDestroy(tt);
cudaEventDestroy(uu);
}
};
Run Code Online (Sandbox Code Playgroud)
静态实例化:
int main() {
A t;
cudaDeviceReset();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
退出时出现段错误。问题:可能cudaDeviceReset()在退出时自动调用main()?
否则整个有用的代码main()应该转移到 some run(),并且cudaDeviceReset()应该是 中的最后一个命令main(),对吗?
正如 Talonmies 所指出的,A 类的析构函数是在 cudaDeviceReset() 函数被调用之后调用的,即 main(..) 函数完成时。
我认为,您可以将 cudaDeviceReset() 用作 atexit(..) 函数。
void myexit() {
cudaDeviceReset();
}
int main(...) {
atexit(myexit);
A t;
return 0;
}
Run Code Online (Sandbox Code Playgroud)