我怀疑在某些较大的代码(可能还有其他情况)中,“黑盒子”(GPU)无法完全关闭,因此我建议在main()
函数结束时添加cudaDeviceReset()
。但是等等!这样会导致在main()
中静态创建、并且析构函数中包含非平凡CUDA代码的所有类实例都会出现Segmentation fault
,对吗?例如:
class A {
public:
cudaEvent_t tt;
cudaEvent_t uu;
A() {
cudaEventCreate(&tt);
cudaEventCreate(&uu);
}
~A(){
cudaEventDestroy(tt);
cudaEventDestroy(uu);
}
};
静态实例化:
int main() {
A t;
cudaDeviceReset();
return 0;
}
退出时出现段错误。问题:是不是从main()
退出时自动调用了cudaDeviceReset()
?
否则,main()
的整个有用代码应该移到某个run()
中,并且cudaDeviceReset()
应该作为main()
中的最后一条命令,对吗?