CUDA设备代码支持哪些真正的C ++语言结构?

时间:2011-02-04 15:00:45

标签: c++ class cuda gpu gpgpu

3.2版CUDA文档的附录D是指CUDA设备代码中的C ++支持 很明显,CUDA支持“计算能力2.x设备的类”。但是,我正在使用计算能力1.1和1.3的设备,我可以使用这个功能!

例如,此代码有效:

// 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(); 
}

我也可以使用广泛的库,例如Thrust :: random random generation classes。 我唯一的猜测是,由于__device__标记函数的自动内联,我能够这样做,但这并不能解释成员变量的处理方式。

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

2 个答案:

答案 0 :(得分:11)

很可能,CUDA不支持2.0之前的设备上的课程。

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

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

  • 可见性(公共/受保护/私人)
  • 非虚拟继承
  • 整个模板编程和元编程(直到你发现nvcc错误;从版本3.2开始有很多这样的错误)
  • 构造函数(除了在__ shared __ memory中声明对象时)
  • 命名空间

您无法使用以下内容:

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

实际上,“CUDA编程指南”第D.6章中的所有示例都可以编译设备< 2.0

答案 1 :(得分:0)

某些C ++类功能可行,但编程指南基本上说它不完全受支持,因此所有 C ++类功能都不起作用。如果你能做你想做的事,那么你应该继续!