例如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/