目前我想设置一个全局变量,并且动态分配内存,设为__device__ double *sz;然后在主函数中直接分配内存行不通,然后搜索网页得到一种方法是int tmp;
cudaMalloc((void **)&tmp, sizeof(int) * num);
cudaMemcpy(tmp,某个数组,numsizeof(int),cudaMemcpyHostToDevice);
cudaMemcpyToSymbol(sz, &tmp, sizeof(int *),size_t(0), cudaMemcpyHostToDevice);
这样检测过,可以得到sz数组,请问这样对不对,有没有绕弯路?
此外,如果我的某个数组那里是vector类型的,比如vector sz1;
cudaMemcpy函数里是不是应该写成&sz1[0],
用vector类型时,会不会有什么问题,按理说,vector的内存空间应该是连续的吧,应该不会有影响吧。
楼主您好,
您通过设置一个全局指针,
然后分配显存上的缓冲区,
然后将首地址复制到此指针的操作,是正确的。
(但我推荐你如果需要一段缓冲区,可以直接cudaMalloc分配,然后首地址(指针),作为参数传给kernel即可。无需这么麻烦)
关于您的第二个问题,C++的vector是否连续存储,以及它是否能在CUDA中使用,
我表示不是C++用户,无法评估此类(vector)在CUDA kernel中能否使用。
(但建议您不要使用,请使用数组或者cudaMalloc出来的缓冲区,这个是必然连续的)
感谢您的来访。
版主,您第一个括号里的没大明白,是指不推荐使用全局变量嘛?然后kernel函数加一个指针变量的形参嘛?
楼主您好,您的理解是正确的。
不要使用一个全局的指针变量,而是在host上cudaMalloc出来后,作为参数传递。
这是推荐的方式。