Cuda 是否将对象复制到设备?

Cuda 是否将对象复制到设备?,cuda,Cuda,我可以将C++对象复制到设备吗?< /p> 假设我有: class CudaClass { public: int* data; CudaClass(int x) { data = new int[1]; data[0] = x; } }; __global__ void useClass(CudaClass cudaClass) { printf("%d" cudaClass.data[0]); }; int main() { CudaClass c(1); }

我可以将C++对象复制到设备吗?< /p> 假设我有:

class CudaClass
{
public:
int* data;
CudaClass(int x) {
    data = new int[1]; data[0] = x;
}
};

__global__ void useClass(CudaClass cudaClass)
{
    printf("%d" cudaClass.data[0]);
};


int main()
{
    CudaClass c(1);
}

现在,我如何将“c”复制到设备内存并启动内核“useClass”?

是的,您可以将对象复制到设备以在设备上使用。当对象具有指向动态分配区域的嵌入式指针时,该过程需要一些额外的步骤

有关所涉及内容的讨论,请参阅。该答案还有一些与之相关的示例代码答案

此外,在类定义中,如果您希望某些函数在设备上可用,则应适当地修饰这些函数(即,可能使用
\uuuuuuuu device\uuuuuuu\uuuuuu host\uuuuu

编辑:在回答一个问题(现在已删除)时,以下是我根据提供的代码得出的最简单的示例代码:

#include <stdio.h>

class CudaClass
{
public:
int* data;
CudaClass(int x) {
    data = new int[1]; data[0] = x;
}
};

__global__ void useClass(CudaClass *cudaClass)
{
    printf("%d\n", cudaClass->data[0]);
};




int main()
{
    CudaClass c(1);
    // create class storage on device and copy top level class
    CudaClass *d_c;
    cudaMalloc((void **)&d_c, sizeof(CudaClass));
    cudaMemcpy(d_c, &c, sizeof(CudaClass), cudaMemcpyHostToDevice);
    // make an allocated region on device for use by pointer in class
    int *hostdata;
    cudaMalloc((void **)&hostdata, sizeof(int));
    cudaMemcpy(hostdata, c.data, sizeof(int), cudaMemcpyHostToDevice);
    // copy pointer to allocated device storage to device class
    cudaMemcpy(&(d_c->data), &hostdata, sizeof(int *), cudaMemcpyHostToDevice);
    useClass<<<1,1>>>(d_c);
    cudaDeviceSynchronize();
    return 0;
}
Cudamaloc无法使用存储已在设备上的指针。这是行不通的:

cudaMalloc(&(d_c->data), sizeof(int));

因为它需要在主机代码中取消对设备指针(d_c)的引用,这是不允许的。

好的,还有一个问题:我看到的是,您在设备上分配了一些内存,然后将指针值复制到对象内的数组中。为什么我不能直接为myobject.array分配,而不是使用“中间”变量来保存数据并将其指针复制到myobject.array中?回答这个问题时,我对答案进行了编辑。我相信我已经在其中一个链接答案后的问题中解决了这个问题。非常感谢,非常清楚的回答!如果可以的话,还有一个问题:为什么我不能在构造函数中使用cudamaloc((void**)和data,100*sizeof(int))而不是data=new int[100]?我认为应该直接在设备上分配,而不是在主机上,然后复制到设备上。Cheers
hostdata
包含指向设备内存的指针。但是
&hostdata
是指向主机内存中某个位置的指针。因此,不,该指针不在“设备上”,也不指向“设备上”的位置<代码>&主机数据指向主机内存中的某个位置
hostdata
指向设备内存中的一个位置。对于这个问题中的这个简单的类,唯一需要做的就是反转复制实际数据的
CudamCpy
操作,因此在内核之后,类似于:
CudamCpy(c.data,hostdata,sizeof(int),CudamCpyDeviceToHost)。更复杂的对象可能需要几个步骤。由于将对象本身从设备直接复制回主机会使对象中的嵌入式指针无效,因此需要一种方法来保留或“修复”这些指针,这与此答案演示“修复”设备对象中的嵌入式指针的方式大致相同。
cudaMalloc(&(d_c->data), sizeof(int));