Cuda主机对象到设备

时间:2012-11-01 20:48:14

标签: cuda host-object

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

现在的问题是,有没有办法从主机到设备获取已存在的对象?我仍然使用我的代码的序列版本来读取一些几何和物理数据。如果可以在不使用中间阵列的情况下将其复制到设备上,那么设备如何在不使用sizeof的情况下处理其大小?

我是否会使用这样的东西进行分配?

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

任何建议都会非常感激。

1 个答案:

答案 0 :(得分:1)

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) {