2017-07-15 8 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

説明をありがとう。私はこの1つを投稿する前に、それらの質問に行きました。私は、オブジェクトポインタのベクトルをコピーするだけでは、オブジェクトのベクトルをデバイスにコピーするよりも、時間を消費するという意見がありました。何か不足していますか? –

+0

各オブジェクトが 'new'で個々に割り当てられているオブジェクトポインタのベクトルは、デバイスに便利にコピーすることはできず、他の問題のなかでもループをコピーする必要があります。私が指摘した質問は、ポインタの配列を扱う方法を議論する質問です。あなたはそれが本質的にどのようにポインタの配列を処理するあなたの質問に関係がないと仮定しますか? –

答えて

0

'cuMemcpyHtoD'を使用してオブジェクトポインタをデバイスにコピーできます。

私はこのようなJCudaでデバイスへのポインタにコピーします。ここでは

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

を、 'arrayPointer' CUDAカーネル内の1つの 'フロート**' のようなものです。多くのCUdeviceptr(float *など)がCPUのelementPtrsに最初に割り当てられ、上記のようにcuMemcpyHtoDを呼び出してデバイス上に「float **」を形成します。 Sizeof.POINTERは64ビットシステムでは8です。

関連する問題