用户
 找回密码
 立即注册
hrbspider 该用户已被删除
发表于 2013-9-22 11:49:52
80522
下面这种结构体拷贝方法 我总觉得不对,但是结果却是正确的 ,为什么呢?
正确的使用方法是什么样的?
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;

使用道具 举报 回复
发表于 2013-9-22 12:37:58
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会立即挂掉。

您不妨逐一尝试。

祝您好运~
使用道具 举报 回复 支持 反对
发表于 2013-9-22 12:42:09
使用道具 举报 回复 支持 反对
发新帖
您需要登录后才可以回帖 登录 | 立即注册