【发布时间】:2013-05-31 04:54:53
【问题描述】:
由于我怀疑“黑匣子”(GPU)在一些较大的代码(others perhaps too)中没有完全关闭,我会在main() 的末尾添加一个cudaDeviceReset()。可是等等!这将Segmentation fault 在main() 中静态创建的所有类实例在析构函数中使用非平凡的CUDA 代码,对吧?例如
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() 中的最后一个命令,对吧?
【问题讨论】:
-
cudaDeviceReset 显式销毁由调用它的进程或线程持有的活动设备上的任何上下文。但它所做的一切。如果您有 CUDA API 调用需要上下文才能在析构函数代码中工作,那么您不能在上下文已经销毁后调用它们(并且在进程终止时它将被运行时自动销毁)。
标签: cuda