首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >库达错误-虚拟函数,继承,新运算符

库达错误-虚拟函数,继承,新运算符
EN

Stack Overflow用户
提问于 2015-03-26 16:06:22
回答 1查看 223关注 0票数 1

使用OOP CUDA代码,我在全局函数中使用对象创建有奇怪的行为

CUDA设备: Tesla C2075,计算能力: 2.0

没有新的操作符,一切都能工作。

使用新运算符->失败: CUDA_ERROR_NO_BINARY_FOR_GPU

见代码:

BaseClass:

代码语言:javascript
运行
复制
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衍生:

代码语言:javascript
运行
复制
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衍生:

代码语言:javascript
运行
复制
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的内核最终处于错误状态:

代码语言:javascript
运行
复制
 __global__ void CreateSphere(size_t *objectHandle_in)
{   
    Sphere *aObject = new Sphere();  

}

状态良好:

代码语言:javascript
运行
复制
 __global__ void CreateSphere(size_t *objectHandle_in)
{   
    Sphere *aObject ;  

}

来自数据自动化系统方案编制指南:

当派生类中的函数重写基类中的虚拟函数时,重写和重写函数上的执行空间限定符(即主机device)必须匹配。 它不允许作为参数传递给全局函数,它是具有虚拟函数的类的对象。编译器将虚拟函数表放置在全局或常量内存中。

但是我只创建了这个对象,在这个场景中,它也失败了:

代码语言:javascript
运行
复制
__device__ creatDevSphere()
    {
    Sphere *aObject  = new Sphere();  
    }

  __global__ void CreateSphere(size_t *objectHandle_in)
    {   
        creatDevSphere();

    }

我知道新运算符在CC中是可用的,2.0...or不是吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-26 19:25:57

我想您使用的是CUDA 7,因为您使用了C++11功能。setCodegetCode方法要么需要在Base类中实现,要么它们必须是纯虚拟的。

这对我来说很管用:

代码语言:javascript
运行
复制
__device__ virtual void setCode(float r) = 0;
__device__ virtual void getCode(float q) = 0;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29283418

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档