关于 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 的参考参数的主要内容,如果未能解决你的问题,请参考以下文章

cuda8.0怎么安装

如何理解Cuda中的cudaMalloc函数的第一个参数是两个星星?

如何理解Cuda中的cudaMalloc函数的第一个参数是两个星星?

如何理解Cuda中的cudaMalloc函数的第一个参数是两个星星?

关于CUDA程序的grid和block size选择

tensorflow只能在装有gpu的机器上运行