关于 Cuda 的参考参数
Posted
技术标签:
【中文标题】关于 Cuda 的参考参数【英文标题】:reference argument on Cuda 【发布时间】:2013-07-21 14:18:37 【问题描述】:我不知道 cuda 不支持引用参数。我的程序中有这两个函数:
__global__ void
ExtractDisparityKernel ( ExtractDisparity& es)
es ();
__device__ __forceinline__ void
computeAdjacentValue (int x1, int y1, int x2, int y2, float& value )
....
给定global函数,编译器报错: /home/lv/pcl-trunk/gpu/kinfu_large_scale/src/cuda/estimate_combined.cu(959):错误:全局例程不能有引用参数
我搜索了一些解决方案。有人说不允许。 但是 device 函数不会报告此类错误。我很困惑 cuda 是否支持参考参数。或者编译器以某种方式被愚弄了。
任何人都可以对这个问题给出完整的答案:允许和不允许引用的地方?
【问题讨论】:
【参考方案1】:__global__
函数上的引用参数将不起作用,因为通过引用传递参数实际上会创建一个指针,该函数将使用该指针来引用该参数。但是,这通常会导致取消引用设备代码上的主机指针,这是不允许的。
但是,__device__
函数可以使用引用参数,因为在设备代码中取消引用设备指针是合法的。
关于“解决方案”,只需传递一个指针:
ExtractDisparityKernel ( ExtractDisparity *es)
当然,请确保您传递的参数是正确的 cudaMalloc
-created 指针。
一般来说,与下面的评论相反,可以在 CDP(CUDA 动态并行)设置中对子内核使用引用参数。由于 CDP 设置中的其他限制,例如对使用父内核的本地内存空间的限制,某些类型的引用参数可能仍然无法使用。
随着统一内存 (UM) 的出现,现在甚至可以在从主机代码调用的内核上使用引用参数,并正确使用 UM。
【讨论】:
以上是关于关于 Cuda 的参考参数的主要内容,如果未能解决你的问题,请参考以下文章
如何理解Cuda中的cudaMalloc函数的第一个参数是两个星星?
如何理解Cuda中的cudaMalloc函数的第一个参数是两个星星?