将类对象传递给内核

Arj*_*K R 8 c++ cuda

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

考虑我有一堂课

class MyClass
{
    public:
        int value;
        float rate;
        MyClass()
        {
            value = 0; rate = 0;
        }
        MyClass(int v,float r)
        {
            value = v; rate = r;
        }
};
Run Code Online (Sandbox Code Playgroud)

我的内核获取了MyClass对象的数组

__global__ void MyKernel(MyClass * mc)
{
    //Some Calculation
}
Run Code Online (Sandbox Code Playgroud)

我可以通过阵列吗?如何分配内存?现在我尝试使用以下代码得到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
Run Code Online (Sandbox Code Playgroud)

tal*_*ies 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() {};
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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