CUDA错误-虚拟函数,继承,NEW运算符

CUDA ERROR - virtual func, inheritance, NEW Operator

本文关键字:继承 运算符 NEW 函数 错误 虚拟 CUDA      更新时间:2023-10-16

使用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功能。setCodegetCode方法需要在Base类中实现,或者它们必须是纯虚拟的。

这对我有效:

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