Arrays 传递给CUDA的结构中的指针

Arrays 传递给CUDA的结构中的指针,arrays,pointers,cuda,struct,Arrays,Pointers,Cuda,Struct,我已经在这件事上胡闹了一段时间了,但似乎不能把它弄对。我正在尝试将包含数组的对象复制到CUDA设备内存中(然后再复制回来,但当我遇到这个问题时,我会跨越这座桥): struct MyData{ 浮动*数据; int dataLen; } void copyToGPU(){ //创建要复制的虚拟对象 int N=10; MyData*h_items=新的MyData[N]; 对于(int i=0;i 为所有设备分配设备数据 结构,作为单个数组 将连续数据从主机复制到 GPU 调整GPU指针 例如

我已经在这件事上胡闹了一段时间了,但似乎不能把它弄对。我正在尝试将包含数组的对象复制到CUDA设备内存中(然后再复制回来,但当我遇到这个问题时,我会跨越这座桥):

struct MyData{
浮动*数据;
int dataLen;
}
void copyToGPU(){
//创建要复制的虚拟对象
int N=10;
MyData*h_items=新的MyData[N];
对于(int i=0;i
  • 为所有设备分配设备数据 结构,作为单个数组
  • 将连续数据从主机复制到 GPU
  • 调整GPU指针
例如:

float *d_data;
cudaMalloc((void**)&d_data, N*100*sizeof(float));
for (...) {
    h_items[i].data = i*100 + d_data;
}

您提供的代码只复制MyData结构:一个主机地址和一个整数。为了更加清楚,您复制的是指针,而不是数据-您必须显式复制数据

如果数据总是相同的
长度
,那么您可能只想制作一个大数组:

float *d_data;
memSize = N * LENGTH * sizeof(float);
cudaMalloc((void**) &d_data, memSize);

//and a single copy
cudaMemcpy(d_data, h_data, memSize, cudaMemcpyHostToDevice);
如果需要与其他数据一起位于结构中,则:

struct MyData {
  float data[LENGTH];
  int other_data;
}

MyData *d_items;
memSize = N * sizeof(MyData);
cudaMalloc((void**) &d_items, memSize);

//and again a single copy
cudaMemcpy(d_data, h_data, memSize, cudaMemcpyHostToDevice);
但是,我假设您有各种长度的数据。一种解决方案是将长度设置为最大长度(只需浪费一些空间),然后按照上面的方法执行。这可能是最简单的开始方式,然后您可以稍后进行优化

如果您负担不起丢失的内存和传输时间,那么对于主机和设备,我将有三个阵列,一个包含所有数据,一个包含偏移量,一个包含长度:

//host memory
float *h_data;
int h_offsets[N], h_lengths[N]; //or allocate these dynamically if necessary
int totalLength;

//device memory
float *d_data;
int *d_offsets, *d_lengths;

/* calculate totalLength, allocate h_data, and fill the three arrays */

//allocate device memory
cudaMalloc((void**) &d_data, totalLength * sizeof(float));
cudaMalloc((void**) &d_ffsets, N * sizeof(int));
cudaMalloc((void**) &d_lengths, N * sizeof(int));

//and now three copies
cudaMemcpy(d_data, h_data, totalLength * sizeof(float), cudaMemcpyHostToDevice);
cudaMemcpy(d_offsets, h_offsets, N * sizeof(int); cudaMemcpyHostToDevice);
cudaMemcpy(d_lengths, h_lengths, N * sizeof(int); cudaMemcpyHostToDevice);
现在,在线程
i
中,您可以找到从
d_数据[d_偏移量[i]]开始,长度为
d_数据[d_长度[i]]的数据。

//host memory
float *h_data;
int h_offsets[N], h_lengths[N]; //or allocate these dynamically if necessary
int totalLength;

//device memory
float *d_data;
int *d_offsets, *d_lengths;

/* calculate totalLength, allocate h_data, and fill the three arrays */

//allocate device memory
cudaMalloc((void**) &d_data, totalLength * sizeof(float));
cudaMalloc((void**) &d_ffsets, N * sizeof(int));
cudaMalloc((void**) &d_lengths, N * sizeof(int));

//and now three copies
cudaMemcpy(d_data, h_data, totalLength * sizeof(float), cudaMemcpyHostToDevice);
cudaMemcpy(d_offsets, h_offsets, N * sizeof(int); cudaMemcpyHostToDevice);
cudaMemcpy(d_lengths, h_lengths, N * sizeof(int); cudaMemcpyHostToDevice);