1

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

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

我是否使用类似的东西进行分配?

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

任何建议将不胜感激。

4

1 回答 1

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) {
于 2012-11-01T22:17:55.147 回答