【问题标题】:CUDA ERROR - virtual func, inheritance, NEW OperatorCUDA ERROR - 虚拟函数、继承、新运算符
【发布时间】: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 编程指南:

当派生类中的函数覆盖一个虚函数时 基类,执行空间限定符(即,hostdevice) 上的覆盖和覆盖函数必须匹配。

不允许作为参数传递给 global 函数 具有虚函数的类的对象。

虚函数表被放置在全局或常量内存中 编译器。

但我只是在创建对象,在这种情况下它也失败了:

__device__ creatDevSphere()
    {
    Sphere *aObject  = new Sphere();  
    }

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

    }

我知道 CC 2.0 中可以使用 new 运算符...或者不可以?

【问题讨论】:

    标签: c++ cuda


    【解决方案1】:

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

    这对我有用:

    __device__ virtual void setCode(float r) = 0;
    __device__ virtual void getCode(float q) = 0;
    

    【讨论】:

    • 抱歉问题不完整,我使用的是 Cuda 6.5。并且感谢它现在正在工作,,,,嗯学校错误......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-21
    • 2015-08-08
    • 1970-01-01
    • 2016-10-26
    • 2013-08-24
    相关资源
    最近更新 更多