由于某些原因(超出了这个问题的范围)我有一个模板结构:
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 编译)上运行失败,并出现以下错误:
error: attributes may not appear here
我应该如何修改此代码以使其与 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 的
关于c++ - 设备函数指针作为模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53225799/