出于某些原因(超出此问题的范围),我有一个模板结构:
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一起使用? 还是应该在命令行中添加标志?
答案 0 :(得分:1)
好吧,答案很简单:
__device__
属性放错了位置(由编译器指示)。 func
结构应类似于:
template<typename T, retV (* __device__ funcptr)(T)>
struct func
{
__device__ inline retV invoke(T i) { funcptr(i); }
};
但是我不知道为什么nvcc和nvrtc对此有不同的期望。