设备函数指针作为模板参数



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

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一起工作?还是应该在命令行中添加标志?

答案很简单:

__device__属性放错位置(如编译器所示(。func结构应该看起来像:

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

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

编辑:Nvrtc 11及以上版本不再支持此语法。可能是因为nvrtc是基于clang的

相关内容

  • 没有找到相关文章