我如何将设备内存分配给我在CUDA中的指针

How do I allocate device memory to my array of pointers, in CUDA?

本文关键字:CUDA 指针 内存 分配      更新时间:2023-10-16

我在主机上有以下数据结构:

typedef struct point{
   int x;
   int y;
}Point;
 typedef struct pair{
     Point i;
     Point j;
     float cost;
 }Pair;
Pair* pairs[n];   // allocates an array of pointers to pair

现在,我将"对"复制到GPU。因此,我声明以下指针:

Pair **d_pair;

并使用以下内容分配内存:

cudaMalloc((void**)d_pair,(sizeof(Pair)+sizeof(Pair*))*n);

现在,我从主机复制到设备:

cudaMempy(d_pair,pair,(sizeof(Pair)+sizeof(Pair*))*n),cudaMemcpyHostToDevice);

内核原型接收d_pair as:

__global__ my_kernel(Pair* d_pair[], ... ){ 
...
}

上述语句序列是否应按预期工作?如果没有,我进行了什么修改?基本上,我想复制对* Pairs [n];因此," d_pair"。我该怎么做?

它行不通:您正在发送一系列指针,而不是对象本身。您需要具有对的数组(或向量):

Pair pairs[n]; 

,然后:

Pair *d_pair;
cudaMalloc((void**)&d_pair,sizeof(Pair)*n);
cudaMempy(d_pair,pairs,sizeof(Pair)*n,cudaMemcpyHostToDevice);

顺便说一句,这是:

cudaMempy(d_pair,pair,(sizeof(Pair)+sizeof(Pair*))*n),cudaMemcpyHostToDevice);

是无意义的,您为指针和一对分配空间。您的副本使用相同(sizeof(pair) sizeof(pair*))*n)表达式,但阵列对为(n*sizeof(pair*)),因此您要复制不确定的内存。