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()を にシフトしrun()cudaDeviceReset()の最後のコマンドとして使用する必要があり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 に答える