Из-за испорченного CUDA API правильный ответ - написать обертку вокруг их корзины:
void* saneMalloc (size_t n)
{
void* tmp;
if (cudaMalloc(&tmp, n) == cudaSuccess)
return tmp;
return NULL;
}
...
float* a = saneMalloc(n);
Это необходимо сделать, потому что единственный общий тип указателя в C - void*
.Вы можете конвертировать любой указатель на тип в void*
, но это не применимо к void**
.Поэтому, если у вас есть float
, вы не можете передать float**
функции, ожидающей void**
.Это несовместимый тип указателя.
В частности, при передаче параметров в функцию они копируются в соответствии с правилами простого назначения (C17 6.5.16.1).Передача float**
в функцию, ожидающую void**
, является нарушением ограничения правила простого присваивания.Код не может быть скомпилирован правильно, так как это стандартное нарушение языка Си.