2017-07-15 86 views
-2
class bead { 
int ID; 
__host__ __device__ bead(int id){ID=id}; 
} 
void main(void){ 
vector<bead*> beadvec; 
for(int i=0;i<128;i++){ 
bead* b1=new bead(i); 
beadvec.pushback(b1); 
} 
} 

我不确定如何将指针矢量(beadvec)复制到设备。 我应该依靠cudaMemCpy和cudaMalloc函数,还是有推力功能来有效地完成它*/ 在设备代码中,我想访问每个磁珠并对ID进行基本操作。CUDA C++复制指向设备的对象指针

+0

这里需要的概念在CUDA SO标签中有很多其他问题,甚至在[标签信息链接](https://stackoverflow.com/tags/cuda/info)中提到“使用数组CUDA中的指针“。通过提出一系列指针的存储公式,你可能会让事情变得比他们需要的要困难得多。这种类型的对象(而不是指向对象的指针数组)的数组通过比较将变得微不足道。 –

+0

感谢您的澄清。在发布这篇文章之前,我经历了这些问题。我认为,复制对象指针的向量所需的时间比仅将对象向量复制到设备的时间要短。我错过了什么吗? –

+0

对象指针的向量,其中每个对象分别用'new'分配,无法方便地复制到设备,并且需要循环来复制其他问题。我指出的问题是一个讨论如何处理指针数组的问题。你是否认为它对你的问题没有影响,这基本上是如何处理指针数组的? –

回答

0

'cuMemcpyHtoD'可用于将对象指针复制到设备。

我复制指针设备JCuda这样的:

private void updateArrayPointer(CUdeviceptr arrayPointer, CUdeviceptr[] elementPtrs) { 
    JCudaDriver.cuMemcpyHtoD(arrayPointer, Pointer.to(elementPtrs), maxBatchSize * Sizeof.POINTER); 
} 

这里, 'arrayPointer' 就像是在CUDA内核一个 '浮动**'。许多CUdeviceptr(如float *)先分配给CPU上的elementPtrs,然后像上面那样调用cuMemcpyHtoD在设备上形成一个'float **'。 Sizeof.POINTER在64位系统上为8。