Cuda主机对象到设备

Cuda主机对象到设备,cuda,host-object,Cuda,Host Object,我试图在我的cuda设备上复制一个包含很多变量和方法的大类。我已经将类定义放入了一个.cuh文件中,我能够创建对象并在设备代码中使用它们 现在的问题是,有没有办法从主机到设备获取一个已经存在的对象?我仍然使用我的代码的串行版本来读取一些几何和物理数据。如果可以在不使用中间数组的情况下将其复制到设备上,那么在不使用sizeof的情况下,设备如何处理其大小 那么,我是不是要用这样的东西来分配呢 MyClass *MyObject; int size = sizeog(MyClass); cudaMa

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

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

那么,我是不是要用这样的东西来分配呢

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

非常感谢您的建议。

CUDA编译器的设计符合主机编译器中使用的数据结构对齐和打包。因此,您可以安全地在设备和主机之间传递对象,并访问成员,而无需考虑其对齐要求

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

主持人:

如果您需要传递一组对象,一种简单的方法是使用
推力::设备\u向量
。例如:

主持人:


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

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

主持人:

如果您需要传递一组对象,一种简单的方法是使用
推力::设备\u向量
。例如:

主持人:


谢谢,罗杰,我会试试的。谢谢,罗杰,我会试试的
MyKernel<<<grid_dim, block_dim>>>(my_object);
__global__ void MyKernel(MyObject my_object) {
#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) {