0

約 2GB のローカル メモリを使用するカーネルがあります。cudaMalloc以前に実行すると、2.5GB のメモリを割り当てようとするMyが失敗しますkernel_func

kernel_funcの実行が終了した後も 2GB のメモリがまだ使用されていることがわかりましたcudaMalloc。誰かが解決策または説明を持っていますか?

グローバルメモリを使用kernel_funcすると問題が解決することはわかっていますが、何らかの理由で、その巨大なローカル静的配列にローカルメモリを使用する必要があります。

__global__ kernel_func() {

    // The huge static array goes here
    short my_array[50000];

}

int main() {

    kernel_func<<<64, 128>>>();
    // my_array is still occupying memory are this point

    // This cudaMalloc will fail with insufficient memory
    cudaMalloc(/* 2.5GB data */);
}
4

1 に答える 1

3

終了を許可する場合kernel_func(たとえば、でcudaDeviceSynchronize())、my_arrayカーネルが完了した後、つまりこのコメントの時点で、あなたが示唆するように、それがまだ「メモリを占有している」とは思えません。

    // my_array is still occupying memory are this point

その時点でcudaMemGetInfo()を呼び出すと、より確実になります。

それにもかかわらず、あなたが経験しているのは、ある種のメモリの断片化である可能性があります.

私が知っている「スレートをきれいにする」唯一の方法はcudaDeviceReset()、その時点で を呼び出すことです。ただし、これは GPU での割り当てだけでなく操作もすべて強制終了するため、GPU で他のアクティビティが行われていない場合にのみ実行し、必要な GPU データを の呼び出し後に再割り当てする必要がありますcudaDeviceReset()

cudaMalloc確かに、代わりに を使用して割り当てを調整できれば、その方が簡単かもしれません。

cudaDeviceReset()GPU を適切な機能動作に戻すには、それだけでは不十分であることに注意してください。そのためには、「所有」プロセスも終了する必要があります。ここを参照してください。

于 2013-11-19T18:53:24.717 に答える