使用nvcc(CUDA 5.0)编译以下代码时,会出现“内存限定符的非法组合”错误,因为在类中似乎不可能有全局内核。
class A
{
public:
__global__ static void kernel();
};
__global__ void A::kernel()
{}
我理解在处理非静态成员时需要此限制,但为什么在内核声明为静态时仍然发生错误?调用这些成员与在命名空间中声明函数时没有区别(在本例中是A
)。
A::kernel <<< 1, 1 >>> ();
为什么这个功能还没有实现,我是否遗漏了什么原因?
编辑:根据答案和评论中的回复,我的问题并不够清楚。我的问题不是为什么会出现错误。显然,这是因为它还没有被实现。我的问题是为什么它还没有被实现。到目前为止,我还没有想到任何阻止实现此功能的原因。我意识到我可能忘记了一个特殊情况,这会使事情更加复杂,所以我提出了这个问题。
我认为这个功能合理的原因是:
- 静态函数没有
this
指针,因此即使内核被调用的对象存在于主机上,访问其数据也不会产生冲突,因为首先此数据就是无法访问的(来自哪个对象的数据??)。 - 您可以争论说,如果类与之相关的静态数据存在于主机上,原则上应该可以从静态内核中访问该数据。但是,静态数据也不受支持,因此也不存在冲突。
- 在主机上的对象上调用静态内核
A a; a.staticKernel<<<...,...>>>();
与根本不使用对象调用它(A::staticKernel<<<...,...>>>();
)完全等价,就像我们在普通的C++中一样。
我错过了什么?