【发布时间】:2017-04-04 09:20:27
【问题描述】:
使用 OOP CUDA 代码,我在 global 函数中 object creation 有奇怪的行为
CUDA 设备:Tesla C2075,计算能力:2.0
没有新的操作员一切正常
使用新运算符 -> 失败:CUDA_ERROR_NO_BINARY_FOR_GPU
见代码:
基类:
class Base
{
public:
float PositionX;
float PositionY;
float PositionZ;
public:
__device__ Base()
{
}
__device__ void SetPosition(float x, float y, float z)
{
PositionX = x;
PositionY = y;
PositionZ = z;
}
__device__ virtual void setCode(float r);
__device__ virtual void getCode(float q);
};
1导数:
class Box : public Base
{
public:
bool myIsVisible;
float code;
public:
__device__ Box()
{
}
__device__ void setCode(float r) override
{
code = r;
}
__device__ void getCode(float a) override
{
a = code ;
}
}
2导数:
class Sphere : public Base
{
public:
bool myIsVisible;
float code;
public:
__device__ Sphere()
{
}
__device__ void setCode(float r) override
{
code = r;
}
__device__ void getCode(float a) override
{
a = code;
}
}
AAANDe 最后我的内核处于错误状态:
__global__ void CreateSphere(size_t *objectHandle_in)
{
Sphere *aObject = new Sphere();
}
状态良好:
__global__ void CreateSphere(size_t *objectHandle_in)
{
Sphere *aObject ;
}
来自 CUDA 编程指南:
当派生类中的函数覆盖一个虚函数时 基类,执行空间限定符(即,host, device) 上的覆盖和覆盖函数必须匹配。
不允许作为参数传递给 global 函数 具有虚函数的类的对象。
虚函数表被放置在全局或常量内存中 编译器。
但我只是在创建对象,在这种情况下它也失败了:
__device__ creatDevSphere()
{
Sphere *aObject = new Sphere();
}
__global__ void CreateSphere(size_t *objectHandle_in)
{
creatDevSphere();
}
我知道 CC 2.0 中可以使用 new 运算符...或者不可以?
【问题讨论】: