CUDA主机对设备的对象



我正在尝试在我的CUDA设备上复制一个大型类,其中包含许多变量和方法。我已经将类定义放入.cuh文件中,并且能够创建对象并在设备代码中使用它们。

现在的问题是,是否有任何方法可以从主机到设备中获得已经存在的对象?我仍在使用代码的串行版本来阅读一些几何和物理数据。如果可以在不使用中间数组左右的情况下将其复制到设备上,则该设备如何处理其尺寸而不使用sizeof?

当时我将类似的东西用于分配?

MyClass *MyObject;
int size = sizeog(MyClass);
cudaMalloc((void**)&MyObject_device, size);
cudaMemCpy(Myobject_device, MyObject, size,   cudaMemcpyHostToDevice);

任何建议都会非常感谢。

CUDA编译器旨在匹配主机编译器中使用的数据结构对齐和包装。因此,您可以在设备和主机之间安全地传递对象,并访问成员,无论其对齐要求如何。

您可以直接将对象作为内核参数传递。例如:

主机:

MyKernel<<<grid_dim, block_dim>>>(my_object);

设备:

__global__ void MyKernel(MyObject my_object) {

如果您需要传递一系列对象,那么一种简单的方法是使用thrust::device_vector。例如:

主机:

#include <thrust/device_vector.h>
device_vector<MyObject> my_objects;
...
MyObject* my_objects_d = thrust::raw_pointer_cast(&my_objects[0]);
MyKernel<<<grid_dim, block_dim>>>(my_objects_d);

设备:

__global__ void MyKernel(MyObject* my_objects) {

最新更新