2

答えはノーだと確信していますが、メモリリークが発生したくないので、確認したかっただけです。

私は次のコードを使用しています

__constant__ void* VERTEX_NO_CONSTANT_PARAMETER;
HANDLE_ERROR( cudaMemcpyToSymbol( VERTEX_NO_CONSTANT_PARAMETER, &vertexNo, sizeof( int ) ) );
HANDLE_ERROR( cudaFree( VERTEX_NO_CONSTANT_PARAMETER ) );

それは私の心に疑問を投げかけている私にエラーを投げません(私はcudaFreeがエラーになることを望んでいました)。

ありがとうございました!

ケビン

4

2 に答える 2

2

質問では、定数void*VERTEX_NO_CONSTANT_PARAMETERを宣言します。宣言は、定数メモリにsizeof(void *)を予約します。この4/8バイトは、CUDAモジュールがロードされるときにCUDAドライバーによって割り当てられ、CUDAモジュールがアンロードされるときに解放されます。

ホストコードでcudaMallocを呼び出し、cudaMemcpyToSymbolを使用してデバイスポインタをVERTEX_NO_CONSTANT_PARAMETERにコピーした場合でも、プログラムがデバイスメモリを使用して完了した後、cudaFreeを使用してデバイスメモリを解放する必要があります。メモリを解放しない場合、CUDAコンテキストが破棄されたときにドライバーがメモリを解放します。

CUDAは、定数メモリを動的に割り当てるためのAPIを提供していません。__constant__コンスタントメモリは、修飾子を使用してのみ静的に割り当てることができます。

于 2013-02-02T05:07:19.587 に答える
1

いいえ、あなたはしません。NVIDIA cuda ライブラリによると:

cudaFree (void *devPtr) cudaMalloc() または cudaMallocPitch() への以前の呼び出しによって返されたはずの devPtr が指すメモリ空間を解放します [...]

于 2013-02-01T23:13:46.353 に答える