2012-06-24 138 views
0

我有一段代码,它由没有修改权限的对象组成。另一方面,我必须编写CUDA内核来进行一些计算。此刻,我将所需的信息转换为数组或结构并传递给它。是否有可能将对象传递给CUDA内核,并且CUDA内核是否有权访问该类的私有成员?有些人也向我建议。将C++对象传递给CUDA内核

+0

请教[这个答案](http://stackoverflow.com/a/14119245/1593077)到一个相关的问题。 – einpoklum

回答

3

您可以在您的CUDA代码中使用C++功能。它有一些额外的要求。例如内核函数不能是我的一个类的成员。对于使用你自己的数据结构,它需要符合一些要求。作为__device__

  • 你需要实现__device__构造函数,你需要在设备代码中使用

    • 成员应注明。
    • 如果你的结构封装指针,这需要在设备内存中分配。
    • 您可以使用模板,但不能使用具有虚拟功能的类。

    您可以在编程指南的附录D. C/C++语言支持中看到C++数据结构的一些示例。

    至于你的具体问题:

    1. 是的,你可以在内核传递对象。您需要为其实施__device__复制构造函数。
    2. 您可以通过班级方法访问私人成员。您应该使用__device__访问器方法在课堂外使用它。 但是你不能通过内核调用传递具有私有成员的类。
  • +0

    首先感谢您的回答。我仍然对主查询有疑问。假设我有一个C++类ex: - class A(){private:int x;}。现在,我将这个类的一个对象传递给另一个文件中的cuda内核。现在,内核如何访问私有变量。我必须包含内核的类定义才能理解。但是,然后我得到它是无法访问的错误。如果我在类定义中包含__global__函数(),那么g ++将无法编译它。如何去做。 –

    +0

    你能提供一些代码的例子吗? – geek

    +0

    我有一个C++文件fil1.c头文件file.h,它有一个类的定义 - class A {private:int x; void funct();}。在file1.c中实现的funct函数中,我调用了file2.cu中的函数,并说B(),并且我将B的对象objx传递给B。现在B()调用cuda内核K <<<1,1000> >>(objxDev )其中objxDev是类A的一个对象,并且在设备端用适当的memcpy进行了连接。问题是,在内核代码中,我查询objx.x,并且出现无法访问的错误。我必须赋予这个内核函数访问私有成员x的权力,并且不需要afftg A级。 –