什么是真正的C++;CUDA设备代码支持的语言结构? 附录D的3.2版CUDA文档,是指CUDA设备代码中的C++支持。 显然,CUDA支持“计算能力为2.x的设备类”。然而,我正在使用计算能力为1.1和1.3的设备,我可以使用这个功能

什么是真正的C++;CUDA设备代码支持的语言结构? 附录D的3.2版CUDA文档,是指CUDA设备代码中的C++支持。 显然,CUDA支持“计算能力为2.x的设备类”。然而,我正在使用计算能力为1.1和1.3的设备,我可以使用这个功能,c++,class,cuda,gpu,gpgpu,C++,Class,Cuda,Gpu,Gpgpu,例如,此代码可以工作: // class definition voluntary simplified class Foo { private: int x_; public: __device__ Foo() { x_ = 42; } __device__ void bar() { return x_; } }; //kernel using the previous class __global__ void testKernel(uint32_t*

例如,此代码可以工作:

// class definition voluntary simplified
class Foo {
  private:
    int x_;

  public:
    __device__ Foo() { x_ = 42; }
    __device__ void bar() { return x_; }
};


//kernel using the previous class
__global__ void testKernel(uint32_t* ddata) {
    Foo f;
    ddata[threadIdx.x] = f.bar(); 
}
我还能够使用广泛使用的库,如推力::随机生成类。 我唯一的猜测是,由于
\uuuu device\uuuu
标记函数的自动内联,我能够做到这一点,但这并不能解释如何使用AL处理成员变量


您是否曾经在相同的条件下使用过此类功能,或者您是否可以向我解释为什么我的CUDA代码会以这种方式运行?参考指南有什么不对吗?

< P>一些C++类功能将起作用,但是编程指南基本上说它没有得到完全支持,因此不是所有C++类功能都能工作。如果你能做你想做的事情,那你就应该去做

通常,CUDA不支持2.0之前的设备上的类

实际上,根据我的经验,只要在编译时可以解决所有的功能,就可以在所有设备上使用所有C++特性。2.0之前的设备不支持函数调用(所有函数都是内联的),并且没有程序跳转到变量地址(仅在常量地址跳转)

这意味着,可以使用以下C++构造:

  • 可见性(公共/受保护/私有)
  • 非虚拟继承
  • 整个模板编程和元编程(直到你发现了nvcc错误;从3.2版开始,有相当多的错误)
  • 构造函数(对象在____;共享_;内存中声明时除外)
  • 名称空间
您不能使用以下命令:

  • 新建和删除运算符(我相信设备>=2.0可以做到这一点)
  • 虚拟方法(需要在变量地址处跳转)
  • 函数递归(需要函数调用)
  • 例外情况

实际上,《CUDA编程指南》第D.6章中的所有示例都可以针对设备进行编译,但我需要确切地知道什么可以工作。我打算在库中使用这些功能,因此如果它们不安全,我不能依赖它们。我们可以很容易地想象,这段代码在某些情况下会造成严重破坏。我真正需要的是我应该做什么和不应该做什么之间的确切界限。你的回答带来了关于限制的有趣观点。在使用计算能力<2.X的设备时,编译时的必要性似乎是需要考虑的一点。在调查了这个问题之后,我无法(也可能不会)找到比您更好的答案。因此,我依赖您的经验:)无论如何,我现在拥有一个C2050\o/这样我就可以比较我的执行情况,以确保我的代码保持可移植性。谢谢你的回答@CygnusX1