在 CUDA 中使用指针复制 类
Copying classes with pointers in CUDA
我正在尝试在 CUDA 上实现一些涉及 类 的东西,其中有指向另一个 类 的指针。我发现我需要分别为所有这些指针复制内存,这是我的方法
__host__ Production * Production::allocateToDevice() {
Production * productionOnDevice;
size_t productionSize = sizeof(Production);
cudaMalloc((void **) &productionOnDevice, productionSize);
cudaMemcpy(productionOnDevice, this, productionSize, cudaMemcpyHostToDevice);
Vertex * boundRootOnDevice;
cudaMalloc((void **) &boundRootOnDevice, boundRoot->getMemsize());
cudaMemcpy(boundRootOnDevice, boundRoot, boundRoot->getMemsize(), cudaMemcpyHostToDevice);
size_t boundRootPointerSize = sizeof(Vertex *);
cudaMemcpy(&(productionOnDevice->boundRoot), boundRootOnDevice, boundRootPointerSize, cudaMemcpyHostToDevice);
return productionOnDevice;
}
哪里
class Production {
Vertex * boundRoot;
public:
Production(Vertex * root);
__host__ Production * allocateToDevice();
__host__ __device__ Vertex * getBoundNode();
__host__ __device__ void execute();
__host__ __device__ size_t getSize();
};
如您所见,我首先复制了 Production 对象本身,然后它只是成员 Vector,最后我复制了指针。但是我在倒数第二行遇到访问冲突。我做错了什么?
这个:
cudaMemcpy(&(productionOnDevice->boundRoot), boundRootOnDevice,
boundRootPointerSize, cudaMemcpyHostToDevice);
是非法的,因为您已将 boundRootOnDevice
(设备指针)作为 host-to-device 传输中的源指针。这会导致主机尝试在设备地址上执行指针间接寻址,从而导致段错误。
在这种情况下,您可能想执行设备到设备的复制。
我正在尝试在 CUDA 上实现一些涉及 类 的东西,其中有指向另一个 类 的指针。我发现我需要分别为所有这些指针复制内存,这是我的方法
__host__ Production * Production::allocateToDevice() {
Production * productionOnDevice;
size_t productionSize = sizeof(Production);
cudaMalloc((void **) &productionOnDevice, productionSize);
cudaMemcpy(productionOnDevice, this, productionSize, cudaMemcpyHostToDevice);
Vertex * boundRootOnDevice;
cudaMalloc((void **) &boundRootOnDevice, boundRoot->getMemsize());
cudaMemcpy(boundRootOnDevice, boundRoot, boundRoot->getMemsize(), cudaMemcpyHostToDevice);
size_t boundRootPointerSize = sizeof(Vertex *);
cudaMemcpy(&(productionOnDevice->boundRoot), boundRootOnDevice, boundRootPointerSize, cudaMemcpyHostToDevice);
return productionOnDevice;
}
哪里
class Production {
Vertex * boundRoot;
public:
Production(Vertex * root);
__host__ Production * allocateToDevice();
__host__ __device__ Vertex * getBoundNode();
__host__ __device__ void execute();
__host__ __device__ size_t getSize();
};
如您所见,我首先复制了 Production 对象本身,然后它只是成员 Vector,最后我复制了指针。但是我在倒数第二行遇到访问冲突。我做错了什么?
这个:
cudaMemcpy(&(productionOnDevice->boundRoot), boundRootOnDevice,
boundRootPointerSize, cudaMemcpyHostToDevice);
是非法的,因为您已将 boundRootOnDevice
(设备指针)作为 host-to-device 传输中的源指针。这会导致主机尝试在设备地址上执行指针间接寻址,从而导致段错误。
在这种情况下,您可能想执行设备到设备的复制。