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代码会以这种方式运行?参考指南中有什么问题吗?
答案 0 :(得分:11)
很可能,CUDA不支持2.0之前的设备上的课程。
实际上,根据我的经验,只要可以在编译时解析功能,就可以在所有设备上使用所有C ++功能。 2.0之前的设备不支持函数调用(所有函数都是内联的),并且没有程序跳转到变量地址(仅跳转到常量地址)。
这意味着,您可以使用以下C ++构造:
您无法使用以下内容:
实际上,“CUDA编程指南”第D.6章中的所有示例都可以编译设备< 2.0
答案 1 :(得分:0)
某些C ++类功能可行,但编程指南基本上说它不完全受支持,因此所有 C ++类功能都不起作用。如果你能做你想做的事,那么你应该继续!