将类对象传递给内核

时间:2013-01-02 08:44:36

标签: c++ cuda

我们可以将对象传递给内核函数吗?

考虑我有一个班级

class MyClass
{
    public:
        int value;
        float rate;
        MyClass()
        {
            value = 0; rate = 0;
        }
        MyClass(int v,float r)
        {
            value = v; rate = r;
        }
};

并且我的内核获取了MyClass

的对象数组
__global__ void MyKernel(MyClass * mc)
{
    //Some Calculation
}

我可以传递数组吗?如何分配内存?现在我尝试使用以下代码得到CudaMemcpy错误

cudaError_t cudaStatus;

MyClass darr[10] ;
cudaStatus = cudaMalloc((void**)&darr, size * sizeof(MyClass));

if (cudaStatus != cudaSuccess) {
    fprintf(stderr, "cudaMalloc failed!");
    goto label1;
}

cudaStatus = cudaMemcpy(darr, arr, size * sizeof(MyClass), cudaMemcpyHostToDevice);
//arr is a host array

1 个答案:

答案 0 :(得分:15)

这里有一些问题,并不是所有与您看到的错误直接相关的问题。

首先,您必须在主机和设备中定义每个类方法,以便可以在两个内存空间中实例化类(当您执行复制时,只复制每个实例的数据成员)。因此,您的类声明应如下所示:

class MyClass
{
    public :
        int value;
        float rate;
        __device__ __host__ MyClass()
        {
            value = 0; rate = 0;
        }
        __device__ __host__ MyClass(int v,float r)
        {
            value = v; rate = r;
        }
        __device__ __host__ ~MyClass() {};
}

然后您需要正确分配设备内存。如果您想在设备上使用包含10个成员的MyClass数组,请将其分配并复制到设备,如下所示:

MyClass arr[10];
MyClass *darr;
const size_t sz = size_t(10) * sizeof(MyClass);
cudaMalloc((void**)&darr, sz);
cudaMemcpy(darr, &arr[0], sz, cudaMemcpyHostToDevice);

[免责声明:所有使用浏览器编写的代码,从未进行过编译或测试,使用风险自负]

然后,您可以将darr作为参数从主机传递给内核。

相关问题