CUDA错误-虚拟函数,继承,NEW运算符
CUDA ERROR - virtual func, inheritance, NEW Operator
使用OOP CUDA代码,我在全局函数中创建对象时有奇怪的行为
CUDA设备:特斯拉C2075,计算能力:2.0
没有新的操作员,一切都可以
WITH NEW operator->FAILS: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终于让我的KERNEL处于错误状态:
__global__ void CreateSphere(size_t *objectHandle_in)
{
Sphere *aObject = new Sphere();
}
状态良好:
__global__ void CreateSphere(size_t *objectHandle_in)
{
Sphere *aObject ;
}
来自CUDA编程指南:
当派生类中的函数重写基类、执行空间限定符(即host,设备)必须匹配。
不允许将具有虚拟函数的类的对象。
虚拟函数表通过编译器。
但我只是在创建对象,在这种情况下它也会失败:
__device__ creatDevSphere()
{
Sphere *aObject = new Sphere();
}
__global__ void CreateSphere(size_t *objectHandle_in)
{
creatDevSphere();
}
我知道CC 2.0中有新的运营商……或者没有?
我猜您之所以使用CUDA 7,是因为您使用了C++11功能。setCode
和getCode
方法需要在Base
类中实现,或者它们必须是纯虚拟的。
这对我有效:
__device__ virtual void setCode(float r) = 0;
__device__ virtual void getCode(float q) = 0;
相关文章:
- 通过继承类使用来自不同命名空间的运算符
- 运算符继承和 cpp 核心准则 c.128 的问题
- 如果我真的真的想从 STL 容器继承,并且我继承构造函数并删除新运算符,会发生什么?
- 继承模板化转换运算符
- C++ 继承运算符=
- 在继承的模板类中使用下标 [] 运算符
- 如何调用继承的重载运算符<<并在派生类的输出中添加更多文本?
- C++模板化类上继承的运算符'<<'
- 类继承和运算符重载
- 通过继承重载运算符会导致歧义
- 使用继承的指针列表复制构造函数或重载运算符=
- C++中移动赋值运算符的继承
- 如何在C++上的多个继承上下文上使用特定基类中的运算符
- 继承类中的比较运算符
- 继承 C++14 中的模板化运算符 =:g++ 和 clang++ 的不同行为
- 具有继承的未声明标识符(运算符 ostream)
- 如何使用运算符编写可继承的模板类
- C++继承运算符<<
- 继承运算符 +()
- 继承运算符*的问题