Сбой CUDA при освобождении памяти после ошибки выполнения ядра - PullRequest
1 голос
/ 27 мая 2011

Я обнаружил странное поведение CUDA.После того, как я получил segfault в своем ядре, я пытался освободить ранее выделенную память, и это не удалось.CUDA делает это автоматически?Я имею в виду, освобождает ли CUDA память после segfault во время выполнения ядра?

Вот код для воспроизведения моей ситуации.Я проверял это на CUDA 4.0, 4.0rc2 и 3.2

#include <cassert>

__global__ void segfault(){
    int* null = NULL;
    *null = 0;
}

int main() {
    int* i;
    assert (cudaSuccess ==  cudaHostAlloc(&i, sizeof(int)*100, cudaHostAllocMapped));
    segfault<<<1,100>>>();
    assert (cudaErrorLaunchFailure == cudaThreadSynchronize());
    assert (cudaErrorLaunchFailure == cudaGetLastError());
    assert (cudaSuccess == cudaGetLastError());
    assert (cudaSuccess == cudaFreeHost(i));
    return 0;
}

1 Ответ

1 голос
/ 27 мая 2011

По моему опыту, как только вы столкнетесь с такой ошибкой при выполнении CUDA, все последующие операции не будут выполнены, пока вы не перезагрузите устройство.В документации указано, что объем памяти ограничен контекстом CUDA, поэтому при уничтожении контекста (путем сброса устройства) память будет освобождена.

...