由于我怀疑“黑盒子”(GPU)没有在一些较大的代码(others perhaps too)中干净地关闭,我会在{{1}的末尾包含cudaDeviceReset()
}}。可是等等!这将main()
在Segmentation fault
中静态创建的所有类的实例在析构函数中使用非平凡的CUDA代码,对吧? E.g。
main()
静态实例化:
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;
}
退出时可能会自动调用cudaDeviceReset()
吗?
否则main()
的整个有用代码应转移到某个main()
,而run()
应该是cudaDeviceReset()
中的最后一个命令,对吧?
答案 0 :(得分:3)
如Talonmies所示,在调用cudaDeviceReset()函数之后,即在main(..)函数完成时调用类A的析构函数。
我想,您可以将cudaDeviceReset()带到atexit(..)函数。
void myexit() {
cudaDeviceReset();
}
int main(...) {
atexit(myexit);
A t;
return 0;
}