使用OOP CUDA代码,我在全局函数中使用对象创建有奇怪的行为
CUDA设备: Tesla C2075,计算能力: 2.0
没有新的操作符,一切都能工作。
使用新运算符->失败: CUDA_ERROR_NO_BINARY_FOR_GPU
见代码:
BaseClass:
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 ;
}
来自数据自动化系统方案编制指南:
当派生类中的函数重写基类中的虚拟函数时,重写和重写函数上的执行空间限定符(即主机、device)必须匹配。 它不允许作为参数传递给全局函数,它是具有虚拟函数的类的对象。编译器将虚拟函数表放置在全局或常量内存中。
但是我只创建了这个对象,在这个场景中,它也失败了:
__device__ creatDevSphere()
{
Sphere *aObject = new Sphere();
}
__global__ void CreateSphere(size_t *objectHandle_in)
{
creatDevSphere();
}
我知道新运算符在CC中是可用的,2.0...or不是吗?
发布于 2015-03-26 11:25:57
我想您使用的是CUDA 7,因为您使用了C++11功能。setCode
和getCode
方法要么需要在Base
类中实现,要么它们必须是纯虚拟的。
这对我来说很管用:
__device__ virtual void setCode(float r) = 0;
__device__ virtual void getCode(float q) = 0;
https://stackoverflow.com/questions/29283418
复制相似问题