2

我不知道 cuda 不支持引用参数。我的程序中有这两个函数:

  __global__ void
  ExtractDisparityKernel (  ExtractDisparity& es)
  {
    es ();
  }

  __device__ __forceinline__ void
  computeAdjacentValue (int x1, int y1, int x2, int y2, float& value )
  {   ....
  }

给定全局函数,编译器报错:/home/lv/pcl-trunk/gpu/kinfu_large_scale/src/cuda/estimate_combined.cu(959): error: a global routine cannot have reference arguments

我搜索了一些解决方案。有人说不允许。但是设备功能不会报告此类错误。我很困惑 cuda 是否支持参考参数。或者编译器以某种方式被愚弄了。

任何人都可以对这个问题给出完整的答案:允许引用和不允许引用的地方?

4

1 回答 1

6

函数上的引用参数__global__不起作用,因为通过引用传递参数实际上会创建一个指针,函数将使用该指针来引用参数。但是,这通常会导致取消引用设备代码上的主机指针,这是不允许的。

但是__device__,函数可以使用引用参数,因为在设备代码中取消引用设备指针是合法的。

关于“解决方案”,只需传递一个指针:

ExtractDisparityKernel (  ExtractDisparity *es)

当然,请确保您传递的参数是正确的cudaMalloc-created 指针。

一般来说,与下面的评论相反,可以在 CDP(CUDA 动态并行)设置中对子内核使用引用参数。由于 CDP 设置中的其他限制,例如对父内核本地内存空间使用的限制,某些类型的引用参数可能仍然无法使用。

随着统一内存 (UM) 的出现,现在甚至可以在从主机代码调用的内核上使用引用参数,并正确使用 UM。

于 2013-07-22T18:29:33.580 回答