Почему функция 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, как и следовало ожидать. Почему это происходит?
Спасибо.