我正在使用CUDA 5.0和计算能力2.1卡。
问题很简单:内核是否可以成为一个类的一部分? 例如:
class Foo { private: //... public: __global__ void kernel(); }; __global__ void Foo::kernel() { //implementation here }
如果不是,那么解决scheme是做一个类的成员包装函数,并在内部调用内核?
如果是,那么它将作为一个普通的私人function访问私有属性?
(我不只是试着看看会发生什么,因为我的项目现在还有其他一些错误,我认为这是一个很好的参考问题,我很难find使用C ++的参考,基本function的例子可以是发现但不是结构化代码的策略。)
让我暂时把cuda动态的并行性排除在讨论之外(即假定计算能力3.0或之前)。
请记住__ global__用于(仅)从主机调用(但在设备上执行)的cuda函数。 如果你在设备上实例化这个对象,它将不起作用。 此外,为了让设备可访问的私有数据可用于成员函数,该对象将不得不在设备上实例化。
所以你可以有一个内核调用 (即mykernel<<<blocks,threads>>>(...);
嵌入到一个宿主对象成员函数中,但是内核定义(即__ global__装饰器的函数定义)会通常在源代码中的对象定义之前,如前所述,这种方法不能用于在设备上实例化的对象,也不能访问在对象中其他地方定义的普通私有数据(可能是可能想出一个方案来创建设备数据的主机专用对象,在全局内存中使用指针,然后可以在设备上访问,但这种方案乍一看似乎相当复杂)。
通常,设备可用的成员函数将在__ device__装饰器之前。 在这种情况下,设备成员函数中的所有代码都在调用它的线程中执行。
这个问题给出了一个例子(在我编辑的答案中),C ++对象的成员函数可以从主机和设备中调用,在主机和设备对象之间进行适当的数据复制。