洗練された CUDA ベースの Linux アプリケーションがあります。Ubuntu 12.04 (x86_64) と NVIDIA ドライバー 295.41 + CUDA 4.2 Toolkit を使用して、1 枚の NVIDIA GTX 560 Ti カード (1 GB メモリ) を搭載した i7 マシンで実行されます。
アプリケーションは、GPU で約 600 ~ 700 MB のグローバル メモリを必要とし、cudaMalloc()
.
デバッグを行った後、アプリケーションの最初の への最初の呼び出しで一度に約580 MBのグローバル メモリがcudaSetDevice()
割り当てられ、残りのアプリケーションで使用できるメモリは 433 MB しかないことがわかりました。
CUDA リファレンス マニュアルによると、デバイスの「プライマリ コンテキスト」を初期化し、CUDA カーネル (ドライバー API では「モジュール」と呼ばれます) や定数変数などのさまざまなリソースを割り当てます。アプリケーションにはいくつかの__device__ __constant__
変数がありますが、それらの合計量はわずか数 KB です。約 20 ~ 30 のカーネルとデバイス関数があります。
初期化中にCUDAが大量のGPUメモリを割り当てる理由がわかりません。別の最小限のプログラムでは、cudaSetDevice(0); cudaMemGetInfo(&a, &t); printf("%ld, %ld\n", a, t);
約 980 MB の使用可能なメモリしか表示されません。したがって、問題はアプリケーションcudaSetDevice()
にあるはずですが、の実装の詳細は完全に独自のものであるため、このような大量のメモリ割り当ての原因を特定できませんでした。
他のアイデアを得ることができますか?