c++ - 为什么 cudaMalloc() 使用指向指针的指针?

标签 c++ c pointers cuda

例如cudaMalloc((void**)&device_array, num_bytes);

这个问题是asked之前,回复是“因为 cudaMalloc 返回错误代码”,但我不明白 - 双指针与返回错误代码有什么关系?为什么一个简单的指针不能完成这项工作?

如果我写

cudaError_t catch_status;
catch_status = cudaMalloc((void**)&device_array, num_bytes);

错误代码将放在 catch_status 中,返回一个指向分配的 GPU 内存的简单指针就足够了,不是吗?

最佳答案

在 C 中,数据可以通过值或通过 simulated pass-by-reference 传递给函数(即通过指向数据的指针)。按值是一种单向方法,按指针允许函数与其调用环境之间的双向数据流。

当一个数据项通过函数参数列表传递给一个函数,并且该函数期望修改原始数据项以使修改后的值显示在调用环境中,正确的 C 方法是传递通过指针的数据项。在 C 中,当我们通过指针传递时,我们获取要修改的项目的地址,创建一个指针(在这种情况下可能是指向指针的指针)并将地址交给函数。这允许函数在调用环境中修改原始项目(通过指针)。

通常malloc返回一个指针,我们可以在调用环境中使用赋值将这个返回值赋给想要的指针。在 cudaMalloc 的情况下,CUDA 设计者选择使用返回值来携带错误状态而不是指针。因此,调用环境中指针的设置必须通过引用(即通过指针)传递给函数的参数之一进行。由于我们要设置的是一个指针值,我们必须获取指针的地址(创建一个指向指针的指针)并将该地址传递给cudaMalloc函数.

关于c++ - 为什么 cudaMalloc() 使用指向指针的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12936986/

相关文章:

c++ - 正在检查大型订购 list 中的成员资格?

c++ - 如果指针的大小都相同,为什么我们必须声明它们指向的对象类型?

c - 用 C 编程 : Changing member value of struct gives segfault

c++ - 如何从 C++ 项目构建/复制资源文件到调试目标路径?

c++ - 在C++中初始化为其自身的对象

c++ - 对范围项使用 std::set 容器

c++ - 为什么不允许指针+指针,但允许指针+整数?

c - 在 C 和 OpenGL 中移动粒子

c - C中三元运算符采用不同操作数类型的原理

c++ - 未取消引用的迭代器是否超过了数组未定义行为的 "one past-the-end"迭代器?