cudaMalloc()
函数defined使用:
cudaMalloc (
void ** devPtr,
size_t size)
响应here和here很好地解释了为什么应该定义函数来接受指向指针的指针。
然而,我不太清楚为什么我们需要在调用函数类型为void **时输入我们提供的参数。例如。在调用函数时:
catch_status = cudaMalloc((void**)&device_array, num_bytes);
提出here。
据我了解,定义一个接受void类型的函数可以提供更大的灵活性。即看一下cudaMalloc()
函数的定义,我将其解释为它可以接受指向任何类型对象的指针。因此,为什么在调用函数时需要输入强制转换&device_array
(在上面的示例中)。 (这种类型转换的语法似乎在我在整个网络中看到的cudaMalloc()
示例中非常普遍)。只要&device_array
满足它是“指向任何类型数据的指针的指针”的条件,就不足以(a)满足参数的函数定义cudaMalloc()
接受和(b)实现我们的任何计划目标?
我在这里缺少什么?
答案 0 :(得分:7)
转换为void**
始终是错误的,因为此类型不是generic pointer。
因此,当函数具有类型void**
的参数时,传递给它的唯一类型的参数可以是类型:void**
,使得任何强制转换都是错误的或不必要的。
从cudaMalloc获取内存的正确方法(忽略错误检查)是:
void* mem;
cudaMalloc( &mem , num_int_bytes );
int* array = mem;
cudaMalloc( &mem , num_double_bytes );
double* floating = mem;