c++ - 设备函数指针作为模板参数

标签 c++ templates cuda nvrtc

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

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/

相关文章:

c++ - Thrust+boost代码编译错误

cuda - SASS指令的组合格式

c++ - 检查二维数组中相邻方 block 的值

c++ - 原子内存排序和中断消息循环

c# - 为什么在 c#/c++ dll 互操作期间出现 System.AccessViolationException?

c++ - 对成员模板函数的访问控制

指向模板类的非静态成员函数的 C++ 函数指针(类成员)

C++ 3D vector 模板

C++:运算符和模板

c++ - CUDA 全局函数中的局部指针数组