C++ CUDA C++;将对象指针复制到设备 类珠{ int-ID; __主机设备珠(int-id){id=id}; } 真空总管(真空){ 载体beadvec; 对于(int i=0;i

C++ CUDA C++;将对象指针复制到设备 类珠{ int-ID; __主机设备珠(int-id){id=id}; } 真空总管(真空){ 载体beadvec; 对于(int i=0;i,c++,cuda,thrust,C++,Cuda,Thrust,“cuMemcpyHtoD”可用于将对象指针复制到设备 我将指针复制到JCuda中的设备,如下所示: 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); } } 在这里,“arrayPoi

“cuMemcpyHtoD”可用于将对象指针复制到设备

我将指针复制到JCuda中的设备,如下所示:

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);
}
}

在这里,“arrayPointer”就像cuda内核中的一个“float**”。许多CUdeviceptr(像float*)首先分配给CPU上的ElementPtr,并像上面那样调用cuMemcpyHtoD,在设备上形成一个“float**”。Sizeof.POINTER在64位系统上为8。

CUDA SO标记中的许多其他问题涵盖了此处所需的概念,甚至在“在CUDA中使用指针数组”中也提到了这些概念。您提出的存储公式是指针数组,这可能会使事情变得更加困难。这种类型的对象数组(而不是指向对象的指针数组)相比之下,这将是微不足道的。感谢您的澄清。在发布这篇文章之前,我已经仔细考虑了这些问题。我认为复制对象指针的向量将比仅将对象指针的向量复制到设备上花费更少的时间。我是否遗漏了什么?您的对象指针向量,其中每个对象都是独立的配置了
new
,根本无法方便地复制到设备上,并且需要一个循环来复制,以及其他问题。我指出的问题是一个讨论如何处理指针数组的问题。你认为这与你的问题没有关系吗?问题是如何处理指针数组n I linked和其他许多建议将此类分配平坦化,以便于使用,易于复制到设备,并有效访问设备。在这种情况下,从指针向量转换为对象向量是平坦化的一种形式。
private void updateArrayPointer(CUdeviceptr arrayPointer, CUdeviceptr[] elementPtrs) {
    JCudaDriver.cuMemcpyHtoD(arrayPointer, Pointer.to(elementPtrs), maxBatchSize * Sizeof.POINTER);
}