首页 > 解决方案 > 设备函数指针作为模板参数

问题描述

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

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 一起使用?或者我应该在命令行中添加标志?

标签: c++templatescudanvrtc

解决方案


好吧,答案很简单:

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

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

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


推荐阅读