用户
 找回密码
 立即注册
xyflzsj 该用户已被删除
发表于 2013-11-5 16:36:09
85423
目前我想设置一个全局变量,并且动态分配内存,设为__device__ double *sz;然后在主函数中直接分配内存行不通,然后搜索网页得到一种方法是int *tmp;  
cudaMalloc((void **)&tmp, sizeof(int) * num);  
cudaMemcpy(tmp,某个数组,num*sizeof(int),cudaMemcpyHostToDevice);
cudaMemcpyToSymbol(sz, &tmp, sizeof(int *),size_t(0), cudaMemcpyHostToDevice);  
这样检测过,可以得到sz数组,请问这样对不对,有没有绕弯路?
此外,如果我的某个数组那里是vector类型的,比如vector<double> sz1;
cudaMemcpy函数里是不是应该写成&sz1[0],
用vector类型时,会不会有什么问题,按理说,vector的内存空间应该是连续的吧,应该不会有影响吧。



使用道具 举报 回复
发表于 2013-11-5 16:44:23
楼主您好,

您通过设置一个全局指针,
然后分配显存上的缓冲区,
然后将首地址复制到此指针的操作,是正确的。
(但我推荐你如果需要一段缓冲区,可以直接cudaMalloc分配,然后首地址(指针),作为参数传给kernel即可。无需这么麻烦)

关于您的第二个问题,C++的vector是否连续存储,以及它是否能在CUDA中使用,
我表示不是C++用户,无法评估此类(vector)在CUDA kernel中能否使用。
(但建议您不要使用,请使用数组或者cudaMalloc出来的缓冲区,这个是必然连续的)

感谢您的来访。
使用道具 举报 回复 支持 反对
发表于 2013-11-5 16:49:26
玫瑰幻想 发表于 2013-11-5 16:44
楼主您好,

您通过设置一个全局指针,

版主,您第一个括号里的没大明白,是指不推荐使用全局变量嘛?然后kernel函数加一个指针变量的形参嘛?
使用道具 举报 回复 支持 反对
发表于 2013-11-5 17:01:37
xyflzsj 发表于 2013-11-5 16:49
版主,您第一个括号里的没大明白,是指不推荐使用全局变量嘛?然后kernel函数加一个指针变量的形参嘛?
...

楼主您好,您的理解是正确的。

不要使用一个全局的指针变量,而是在host上cudaMalloc出来后,作为参数传递。

这是推荐的方式。
使用道具 举报 回复 支持 反对
发新帖
您需要登录后才可以回帖 登录 | 立即注册