将非POD类型作为CUDA中的_全局函数参数传递

将非POD类型作为CUDA中的_全局函数参数传递,cuda,Cuda,我知道一般来说,非POD类型不能作为参数传递给CUDA内核启动。 但是在我能找到解释的地方,我指的是可靠的来源,比如一本书,一本CUDA手册等等。这个问题的整个前提是不正确的。CUDA内核参数不限于POD类型 您可以通过引用或值自由地将任何完整类型作为参数传递。参数列表的总大小有255字节或4kb的限制,具体取决于编译的体系结构,但这是对内核参数的唯一限制。将类的实例传递给CUDA内核时,必须遵守一些简单的限制,包括: 类实例中设备代码将取消引用的任何指针必须是有效的设备指针 设备代码将调用的类

我知道一般来说,非POD类型不能作为参数传递给CUDA内核启动。
但是在我能找到解释的地方,我指的是可靠的来源,比如一本书,一本CUDA手册等等。

这个问题的整个前提是不正确的。CUDA内核参数不限于POD类型

您可以通过引用或值自由地将任何完整类型作为参数传递。参数列表的总大小有255字节或4kb的限制,具体取决于编译的体系结构,但这是对内核参数的唯一限制。将类的实例传递给CUDA内核时,必须遵守一些简单的限制,包括:

  • 类实例中设备代码将取消引用的任何指针必须是有效的设备指针
  • 设备代码将调用的类中的任何成员函数必须是有效的
    \uuuuu设备\uuuu
    函数
  • 将包含虚拟函数或从虚拟基类型派生的类作为内核参数传递是非法的吗
  • 设备代码中不支持访问命名空间匿名联合的类

  • < CUDA内核代码中C++支持的所有特性和局限性在其中的副本中描述,其中的副本在CUDA工具包的每个版本中都有。你所需要做的就是阅读它。

    这个问题的整个前提是不正确的。CUDA内核参数不限于POD类型

    您可以通过引用或值自由地将任何完整类型作为参数传递。参数列表的总大小有255字节或4kb的限制,具体取决于编译的体系结构,但这是对内核参数的唯一限制。将类的实例传递给CUDA内核时,必须遵守一些简单的限制,包括:

  • 类实例中设备代码将取消引用的任何指针必须是有效的设备指针
  • 设备代码将调用的类中的任何成员函数必须是有效的
    \uuuuu设备\uuuu
    函数
  • 将包含虚拟函数或从虚拟基类型派生的类作为内核参数传递是非法的吗
  • 设备代码中不支持访问命名空间匿名联合的类

  • < CUDA内核代码中C++支持的所有特性和局限性在其中的副本中描述,其中的副本在CUDA工具包的每个版本中都有。你所需要做的就是阅读它。

    你凭什么知道这一点?这是完全错误的。您可以通过引用或值自由地将任何完整类型作为参数传递(参数列表的总大小限制为255字节或4k,但这是唯一的限制)。不要将主机和设备指针的不可移植性与类型限制混为一谈。我的意思是,当我试图传递类时,我无法访问类函数,只能访问存储的数据。但是,如果这些方法有效,您可以访问设备代码中的类方法。看看推力库使用函子的方式,看看这个有效的例子。哦,我明白了,所以我必须像设备函数一样定义。我仍然可以在那里找到一本关于这方面的书,特别是在使用预定义类(如stack.h)时。(我对cuda没有太多经验)@talonmes如果你能给出这个问题的答案,我会投赞成票。你凭什么知道?这是完全错误的。您可以通过引用或值自由地将任何完整类型作为参数传递(参数列表的总大小限制为255字节或4k,但这是唯一的限制)。不要将主机和设备指针的不可移植性与类型限制混为一谈。我的意思是,当我试图传递类时,我无法访问类函数,只能访问存储的数据。但是,如果这些方法有效,您可以访问设备代码中的类方法。看看推力库使用函子的方式,看看这个有效的例子。哦,我明白了,所以我必须像设备函数一样定义。我仍然可以在那里找到一本关于这方面的书,特别是在使用预定义类(如stack.h)时。(我对cuda没有太多经验)@talonmes如果你能给出这个问题的答案,我会投赞成票。