cudaMallocManaged иногда возвращает нулевой указатель? - PullRequest
0 голосов
/ 20 февраля 2020

Почему функция CUDA cudaMallocManaged иногда возвращает нулевой указатель? Я понимаю, что в более старой архитектуре это не поддерживается и возвращает нулевой указатель в этом случае, но у меня есть странная ситуация, когда это работает иногда, но не другие:

int main()
{
    const int n = pow(10, 5);
    int blockSize = 256;
    int N_blocks = (n + blockSize - 1)/blockSize;
    double *val;

    cudaMallocManaged(&val, n*sizeof(double));
    for (int i = 0; i < n; ++i)
    {
        val[i] = 0;
    }

    r_line<<<N_blocks, blockSize>>>(n, val);
    cudaDeviceSynchronize();

работает нормально, и r_line возвращает ожидаемое значение. Если я затем добавлю это к основной функции

    double *rng_test_array;
    const int n_rng = 10;
    cudaMallocManaged(&rng_test_array, n_rng*sizeof(double));
    if (rng_test_array == nullptr)
    {
        printf("Null pointer \n");
        return 1;
    }
    cudaFree(val);
    cudaFree(rng_test_array);
}

и ее запуск покажет, что второй вызов cudaMallocManaged возвращает нулевой указатель. Удаление оператора if и попытка выполнить какие-либо операции с rng_test_array приводят к segfault, как и следовало ожидать. Почему это происходит?

Спасибо.

1 Ответ

0 голосов
/ 20 февраля 2020

Комментарий Роберта Кровеллы был верным; использование cuda-memcheck выявило проблему в ядре r_line, которая вызывала проблемы в дальнейшем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...