我试图在我的cuda设备上复制一个包含大量变量和方法的大类。我已将类定义放入.cuh文件中,并且我能够创建对象并在我的设备代码中使用它们。
现在的问题是,有没有办法从主机到设备获取已存在的对象?我仍然使用我的代码的序列版本来读取一些几何和物理数据。如果可以在不使用中间阵列的情况下将其复制到设备上,那么设备如何在不使用sizeof的情况下处理其大小?
我是否会使用这样的东西进行分配?
MyClass *MyObject;
int size = sizeog(MyClass);
cudaMalloc((void**)&MyObject_device, size);
cudaMemCpy(Myobject_device, MyObject, size, cudaMemcpyHostToDevice);
任何建议都会非常感激。
答案 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) {