我们可以将对象传递给内核函数吗?
考虑我有一个班级
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
答案 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
作为参数从主机传递给内核。