我的主机上有以下数据结构:
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为:
__global__ my_kernel(Pair* d_pair[], ... ){
...
}
上述陈述序列是否应按预期工作?如果没有,我做了哪些修改?基本上,我想复制Pair *对[n];就像“d_pair”一样。我该怎么做?
答案 0 :(得分:2)
它不起作用:您正在发送一个指针数组,但不是对象本身。 你需要一个Pair的数组(或Vector):
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 *)),因此您正在复制未定义的内存。