下面这种结构体拷贝方法 我总觉得不对,但是结果却是正确的 ,为什么呢?
正确的使用方法是什么样的?
struct {int x1;
int x2;
int *p
} Dem;
Dem host;
host.p = new int[100];
host.p[1] = 1;
Dem* dev;
cudaMalloc( (void**)&dev, sizeof(Dem));
cudaMemcpy(dev, &host, sizeof(Dem), cudamemcpyhostodevice);
Dem temp;
cudaMemcpy(&temp, &dev, sizeof(Dem), cudamemcpyhostodevice);
printf(“p = %d \n”, temp.p[1]) ;
结果 是 p = 1;
LZ您好:
您提供的上述代码中,有诸多细节问题,如struct类型定义不正确,cudaMemcpy参数类型不正确,copy方向的枚举类型书写不正确以及方向不正确等。
在修正了上述问题之后,确实能得到您给出的结果,但是这并不代表您这样在device端使用struct是正确的做法。
因为您的上述做法仅仅是将一个指向host的数组的指针copy到device端,然后再copy回来继续在host端使用,这当然是可以的。
以及,如果您在将struct copy到device端之后改变host.p[1]的值,比如host.p[1]=100;这样,您会发现,最后temp.p[1]也是100。
以及,如果您在cudaMemcpy(dev,&host,…)之后,启动一个kernel,将dev作为参数传给kernel,在kernel里面使用dev指向的结构体中p[1]的值,那么kernel会立即挂掉。
您不妨逐一尝试。
祝您好运~