正确使用 cudaDeviceReset()

P M*_*cki 5 cuda

由于我怀疑“黑匣子”(GPU)在某些较大的代码(可能还有其他代码)中没有完全关闭,因此我会cudaDeviceReset()main(). 可是等等!这将在析构函数Segmentation faultmain()使用非平凡的 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(),对吗?

pho*_*oad 3

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

我认为,您可以将 cudaDeviceReset() 用作 atexit(..) 函数。

void myexit() {
  cudaDeviceReset();
}

int main(...) {
  atexit(myexit); 
  A t;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)