にcudaFreeを処理するために、私はグローバル変数をインスタンス化するために使用するクラスを持っている:どのように世界的にインスタンス化された変数
class BitUnpackPtrs
{
public:
ushort* d_dataIn;
BitUnpackPtrs() : d_dataIn(NULL) {};
~BitUnpackPtrs()
{
cudaFree(d_dataIn);
}
void update(...) { ... }
};
クラスは、CUDAメモリの頻繁な割り当てを削減するためのハンドルとして世界的にインスタンス化されます。しかし、私のプログラムが終了すると、CUDA-memcheckは警告を生成します。
プログラムが原因cudaFreeにCUDA API呼び出しに「ドライバがシャットダウン」にcudaErrorCudartUnloading(エラー29)を押してください。
これを処理する適切な方法は何ですか?私はcudaFreeを削除することができますが、このクラスがある時点で非グローバルレベルで使用されると、メモリリークが発生します。私は、メモリをどのように扱うべきかを示すために、コンストラクタ内にフラグを使用することができます。
代わりに、cudaドライバがシャットダウンしているかどうかを検出し、そのインスタンスでcudaFreeを呼び出さない方法がありますか?
コンストラクタまたはデストラクタで呼び出しを行うクラスまたはcudaランタイムAPI関数を呼び出す必要があるクラスのグローバルオブジェクトをインスタンス化しないでください。 CUDAランタイムの初期化/分解は、クラスのコンストラクタとデストラクタで行う処理の正確さに応じて、プログラムの起動時とシャットダウン時に混乱を招く可能性があります。 cudaドライバがシャットダウンしている( 'cuda-memcheck'でフラグが立てられないように)検出し、そのインスタンスで' cudaFree'を呼び出さない方法はありません。 –