以下代码广泛用于GPU全局内存分配:
float *M;
cudaMalloc((void**)&M,size);
我想知道为什么我们必须将指针传递给指向cudaMalloc的指针,以及为什么它的设计不像:
float *M;
cudaMalloc((void*)M,size);
感谢任何简单的描述!
答案 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中传递可修改内容的唯一方法是传递一个指向它的指针。对象本身就是一个指针,你需要传递的是指向指针的指针。