2013-01-02 8 views
7

カーネル関数にオブジェクトを渡すことはできますか? クラスオブジェクトをカーネルに渡す

は、私はクラス

class MyClass 
    { 
     public : 
       int value; 
       float rate; 
       MyClass() 
       { 
        value = 0; rate = 0; 
       } 
       MyClass(int v,float r) 
       { 
        value = v; rate = r; 
       } 
    }; 

を持っており、私のカーネルは、MyClassの

__global__ void MyKernel(MyClass * mc) 
    { 
    //Some Calculation 
    } 

のオブジェクトの配列を受け取り、私は配列を渡すことはできますか?考えてみましょう

どのようにメモリを割り当てるのですか?今、私は次のコードは、すべての直接あなたが見ているものは何でもエラーに関連していないCudaMemcpyエラー

cudaError_t cudaStatus; 

    MyClass darr[10] ; 
    cudaStatus = cudaMalloc((void**)&darr, size * sizeof(MyClass)); 

    if (cudaStatus != cudaSuccess) { 
      fprintf(stderr, "cudaMalloc failed!"); 
    goto label1; 
    } 

    cudaStatus = cudaMemcpy(darr, arr, size * sizeof(MyClass), cudaMemcpyHostToDevice); 
    //arr is a host array 
+1

エラーは何ですか? –

答えて

14

いくつかの問題がここにありますが、持ってみました。

まず、両方のメモリ空間でクラスをインスタンス化できるように(コピーを実行すると、各インスタンスのデータメンバーのみがコピーされます)、ホストとデバイスの両方で各クラスメソッドを定義する必要があります。したがって、クラス宣言は次のようになります。

class MyClass 
{ 
    public : 
     int value; 
     float rate; 
     __device__ __host__ MyClass() 
     { 
      value = 0; rate = 0; 
     } 
     __device__ __host__ MyClass(int v,float r) 
     { 
      value = v; rate = r; 
     } 
     __device__ __host__ ~MyClass() {}; 
} 

次に、デバイスメモリを正しく割り当てる必要があります。

MyClass arr[10]; 
MyClass *darr; 
const size_t sz = size_t(10) * sizeof(MyClass); 
cudaMalloc((void**)&darr, sz); 
cudaMemcpy(darr, &arr[0], sz, cudaMemcpyHostToDevice); 

:あなたは、デバイス上の10人のメンバーとMyClassの配列をしたい場合は、次のようにデバイスに割り当て、コピー[免責事項:ブラウザで書かれたすべてのコードは、遵守していないかテストしない、自己責任で使用します]

これで、ホストからカーネルに引数としてdarrを渡すことができます。

関連する問題