【发布时间】:2022-01-09 22:23:02
【问题描述】:
我有一个这样的课程:
class CudaArray
{
CudaArray() : Ptr(new double[5]) {}
double* Ptr;
int Dimension;
}
然后是另一个类,例如:
class Container
{
short a;
CudaArray* ArrayPtr;
int b;
int c;
}
现在我正在以这种方式在设备上创建数组:
CudaArray H_Array;
CudaArray* D_Array;
Check(cudaMalloc(&D_Array, sizeof(CudaArray)));
Check(cudaMemcpy(D_Array, &H_Array, sizeof(CudaArray), cudaMemcpyHostToDevice));
double* Tmp;
Check(cudaMalloc(&Tmp, sizeof(double) * 5));
Check(cudaMemcpy(Tmp, H_Array.Ptr, sizeof(double) * 5, cudaMemcpyHostToDevice));
Check(cudaMemcpy(&(D_Array->Ptr), &Tmp, sizeof(double*), cudaMemcpyHostToDevice));
我希望能够在设备代码上使用Container 类型的对象,但我无法从现有数组初始化CudaArray 成员。到目前为止我试过了:
Container* Cont = nullptr;
Check(cudaMalloc(&Cont , sizeof(Container)));
Check(cudaMemcpy(&(Cont->ArrayPtr), &D_Array, sizeof(CudaArray*), cudaMemcpyDeviceToDevice));
但我在最后一个 cudaMemcpy 上得到 GPUassert: invalid argument。
如何初始化包含指向设备内存中现有对象(类)的指针的设备类?
此外,是否有更简单或更优雅的方式在主机和设备之间复制复杂对象?
【问题讨论】:
-
这是一个常见问题。 SO
cuda标签上已经有很多问题解释了如何在主机和设备之间复制带有嵌入式指针的类。 -
我阅读了你的几个答案,但遗憾的是它们并没有完全涵盖我在这里寻找的内容......
-
简单地说,你不能在构造函数中通过 new 使用像 CudaArray 这样的类来分配内存
标签: cuda