cudaMalloc не работает, когда используется память компьютера - PullRequest
0 голосов
/ 28 декабря 2011

Возможно ли, что cudaMalloc не удается выделить из-за отсутствия свободной памяти компьютера?
Несмотря на то, что память GPU доступна, происходит сбой cudaMalloc при заполнении ОЗУ (памяти компьютера).
Мой код может суммироватьсяследующий пример кода:

int main()
{
    size_t N=sizeof(int)*100000000;
    while(true)
    {
        int *d_a,*d_b;
        if ( cudaSuccess !=cudaMalloc(&d_a, N)) printf("Error Allocating GPU Memory");
        if ( cudaSuccess !=cudaMalloc(&d_b, N)) printf("Error Allocating GPU Memory"); 
        cudaMemset(d_a,1,N);
        cudaMemset(d_b,2,N);

        int *h_a= (int *)malloc(N);
        int *h_b=(int *)malloc(N);
        if(!h_a || !h_b)  printf("Error Allocating CPU Memory");
        cudaMemcpy(d_a,h_a, N, cudaMemcpyHostToDevice);
        cudaMemcpy(d_b,h_b, N, cudaMemcpyHostToDevice);

        cudaFree(d_a);
        cudaFree(d_b);
    }
    getch();
    return 1;
}

В следующем коде не удается выделить память GPU, только когда память компьютера заполнена!Я получаю ошибку Error Allocating GPU Memory вместо Error Allocating CPU Memory

1 Ответ

0 голосов
/ 28 декабря 2011

Вы освобождаете память GPU на каждой итерации, чтобы она никогда не была заполнена. Операционная система использует ваш жесткий диск в качестве виртуальной памяти, когда ОЗУ переполняется, поэтому код замедляется, но продолжает распределять память на стороне хоста. Возможно, CUDA сохраняет указатель на память устройства в памяти хоста, что может вызвать проблемы при заполнении ОЗУ.

Простой способ проверить это - установить счетчик и посмотреть, на какой итерации возникает ошибка. Затем сначала запустите программу, выделяющую память только на GPU, а затем на одном CPU, если счетчик увеличивается в обоих случаях, то мое предположение верно.

...