为什么我们必须将指针传递给指向cudaMalloc的指针

时间:2012-03-21 22:07:44

标签: cuda

以下代码广泛用于GPU全局内存分配:

float *M;
cudaMalloc((void**)&M,size);

我想知道为什么我们必须将指针传递给指向cudaMalloc的指针,以及为什么它的设计不像:

float *M;
cudaMalloc((void*)M,size);

感谢任何简单的描述!

2 个答案:

答案 0 :(得分:6)

cudaMalloc需要将指针的值写入M(而非*M),因此M必须通过引用传递。

另一种方法是以经典的malloc方式返回指针。但是,与malloc不同,cudaMalloc返回错误状态,就像所有CUDA运行时函数一样。

答案 1 :(得分:0)

更详细地解释需要:

在致电cudaMalloc之前,M点......任何地方,未定义。调用cudaMalloc之后,您希望有效数组出现在它指向的内存位置。人们可以天真地说“然后只是在这个位置分配内存”,但这当然不可能通常:未定义的地址通常甚至不在有效内存中。 cudaMalloc需要能够选择该位置。但是如果指针是按值调用的,则无法告诉调用者在哪里。

在C ++中,可以制作签名

template<typename PointerType>
cudaStatus_t cudaMalloc(PointerType& ptr, size_t);

通过引用传递ptr允许函数更改位置,但由于cudaMalloc是CUDA C API的一部分,因此这不是一个选项。在C中传递可修改内容的唯一方法是传递一个指向它的指针。对象本身就是一个指针,你需要传递的是指向指针的指针。