正确使用cudaDeviceReset()

时间:2012-07-23 07:49:42

标签: cuda

由于我怀疑“黑盒子”(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()中的最后一个命令,对吧?

1 个答案:

答案 0 :(得分:3)

如Talonmies所示,在调用cudaDeviceReset()函数之后,即在main(..)函数完成时调用类A的析构函数。

我想,您可以将cudaDeviceReset()带到atexit(..)函数。

void myexit() {
  cudaDeviceReset();
}

int main(...) {
  atexit(myexit); 
  A t;
  return 0;
}