【发布时间】:2019-04-13 00:39:43
【问题描述】:
由于某些原因(超出了本问题的范围),我有一个模板结构:
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 一起使用? 还是应该在命令行中添加标志?
【问题讨论】:
-
为什么要投反对票?问题似乎合法
-
您使用的是哪个 CUDA 工具包和主机编译器?
-
Windows 上的 Cuda 10.0。视觉 2017 最新。在 Ubuntu 18.04 上也是如此。可能是 gcc 5.4
-
我真的很惊讶它编译。内存空间属性永远不应该应用于类数据。它唯一有效的时间是成员函数。据我所知,nvrtc 是基于 clang 的,这可能解释了差异,但我敢打赌 nvrtc 在这种情况下是正确的