5

由于我怀疑“黑匣子”(GPU)没有在一些较大的代码中干净地关闭(可能还有其他代码),所以我会cudaDeviceReset()main(). 可是等等!这将在析构函数中使用非平凡的 CUDA 代码Segmentation fault静态创建的所有类实例,对吗?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()应该被转移到 some run(),并且cudaDeviceReset()应该是 as last 命令main(),对吧?

4

1 回答 1

3

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

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

void myexit() {
  cudaDeviceReset();
}

int main(...) {
  atexit(myexit); 
  A t;
  return 0;
}
于 2013-01-30T17:51:55.287 回答