2013-04-15 7 views
8

C++オブジェクトをデバイスにコピーできますか?オブジェクトをデバイスにコピーしますか?

は、私が持っていると言う:

class CudaClass 
{ 
public: 
int* data; 
CudaClass(int x) { 
    data = new int[1]; data[0] = x; 
} 
}; 

__global__ void useClass(CudaClass cudaClass) 
{ 
    printf("%d" cudaClass.data[0]); 
}; 


int main() 
{ 
    CudaClass c(1); 
} 

は今どのように私は、デバイスメモリへの "c" をコピーして、カーネルを起動しない "useClassを"?

答えて

14

はい、デバイスに使用するオブジェクトをデバイスにコピーできます。オブジェクトに動的に割り当てられた領域へのポインタが埋め込まれている場合、プロセスにはいくつかの追加ステップが必要です。

何が関係しているのかについては、my answer hereを参照してください。その答えには、それにリンクされたサンプルコードの回答もいくつかあります。

また、クラス定義では、特定の関数をデバイスで使用できるようにするには、これらの関数を適切に(つまりおそらく__device__ __host__で)飾る必要があります。

編集:私は持っている

#include <stdio.h> 

class CudaClass 
{ 
public: 
int* data; 
CudaClass(int x) { 
    data = new int[1]; data[0] = x; 
} 
}; 

__global__ void useClass(CudaClass *cudaClass) 
{ 
    printf("%d\n", cudaClass->data[0]); 
}; 




int main() 
{ 
    CudaClass c(1); 
    // create class storage on device and copy top level class 
    CudaClass *d_c; 
    cudaMalloc((void **)&d_c, sizeof(CudaClass)); 
    cudaMemcpy(d_c, &c, sizeof(CudaClass), cudaMemcpyHostToDevice); 
    // make an allocated region on device for use by pointer in class 
    int *hostdata; 
    cudaMalloc((void **)&hostdata, sizeof(int)); 
    cudaMemcpy(hostdata, c.data, sizeof(int), cudaMemcpyHostToDevice); 
    // copy pointer to allocated device storage to device class 
    cudaMemcpy(&(d_c->data), &hostdata, sizeof(int *), cudaMemcpyHostToDevice); 
    useClass<<<1,1>>>(d_c); 
    cudaDeviceSynchronize(); 
    return 0; 
} 

簡潔さのため/透明度:(今削除された)質問に対してここでは、私が供給された符号に基づいて思い付く可能性が最も簡単なサンプルコードです通常のcudaエラーチェックは不要です。

これに応答して、デバイスベースのクラスのポインタを使用してホストから直接ストレージを割り当てることはできません。そのストレージデバイス上にすでにあるポインタを操作することはできません

int *hostdata; 

cudaMalloc:cudaMallocは、そのようなあなたが得るものとして、通常のホストベースのポインタ格納し、期待するためです。これは動作しません:

cudaMalloc(&(d_c->data), sizeof(int)); 

ホストコードにデバイスポインタ(d_c)を逆参照する必要がありますが、これは許可されていないためです。

+0

okもう一度質問します。デバイスにメモリを割り当ててから、オブジェクト内の配列にポインタ値をコピーするだけです。 myobject.arrayに直接ポインタをコピーしてデータを保持するために "中間"変数を使用する代わりに、myobject.arrayを直接割り当てることができないのはなぜですか? –

+0

私の答えを編集してこの質問に答えました。私はすでにリンクされた答えの1つの後に投稿された質問にもこの問題に取り組んでいると信じています。 –

+0

ありがとう、非常に明確な答え! もう1つ質問があります:どうしてできないのですか? CudaMalloc((void **)&data、100 * sizeof(int)) data = new int [100] ではなくコンストラクタで? 私は、ホスト上ではなく直接デバイス上に割り当て、次にデバイスにコピーするべきだと考えました。 乾杯。 –

関連する問題