9

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

考虑我有一堂课

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
4

1 回答 1

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作为参数从主机传递给内核。

于 2013-01-02T09:00:51.807 回答