【问题标题】:device function pointer as template parameter设备函数指针作为模板参数
【发布时间】:2019-04-13 00:39:43
【问题描述】:

由于某些原因(超出了本问题的范围),我有一个模板结构:

template<typename T, __device__ retV (*funcptr)(T)>
struct func 
{
    __device__ inline retV invoke(T i) { funcptr(i); }
};

可以这样使用:

__device__ double increment(double x) {
    return x + 1.0;
}

__constant__ func<double, double, &increment> myfunc;

__device__ double apply(double x) 
{
    return myfunc.invoke(x);
}

这适用于 nvcc (cuda 10.0),但会因 nvrtc (JIT 编译) 而失败,并出现以下错误:

错误:属性可能不会出现在这里

我应该如何修改此代码以使其与 nvrtc 一起使用? 还是应该在命令行中添加标志?

【问题讨论】:

  • 为什么要投反对票?问题似乎合法
  • 您使用的是哪个 CUDA 工具包和主机编译器?
  • Windows 上的 Cuda 10.0。视觉 2017 最新。在 Ubuntu 18.04 上也是如此。可能是 gcc 5.4
  • 我真的很惊讶它编译。内存空间属性永远不应该应用于类数据。它唯一有效的时间是成员函数。据我所知,nvrtc 是基于 clang 的,这可能解释了差异,但我敢打赌 nvrtc 在这种情况下是正确的

标签: c++ templates cuda nvrtc


【解决方案1】:

嗯,答案很简单:

__device__ 属性放错了位置(如编译器所示)。 funcstruct 应该如下所示:

template<typename T, retV (* __device__  funcptr)(T)>
struct func 
{
    __device__ inline retV invoke(T i) { funcptr(i); }
};

但我不知道为什么nvcc和nvrtc对此有不同的期望。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-10
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多