2013-01-02 1 views
7

È possibile passare un oggetto a una funzione del kernel?Passaggio di un oggetto di classe a un kernel

Considerate Ho una classe

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

e la mia Kernel accetta un array di oggetti di MyClass

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

Posso passare la matrice? Come allocare memoria ?? In questo momento ho provato con il seguente codice ha ricevuto l'errore 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

Qual è l'errore? –

risposta

14

Ci sono alcuni problemi qui, non tutti direttamente connessi a qualsiasi errore che state vedendo.

In primo luogo, sarà necessario definire ciascun metodo di classe nell'host e nel dispositivo in modo che la classe possa essere istanziata in entrambi gli spazi di memoria (quando si esegue una copia, vengono copiati solo i membri dati di ciascuna istanza). Quindi la dichiarazione di classe dovrebbe essere simile a questa:

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

Quindi è necessario allocare correttamente la memoria del dispositivo. Se si desidera una serie di MyClass con 10 membri sul dispositivo, allocare e copiarlo nella dispositivo come questo:

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

[disclaimer: tutto il codice scritto in del browser, non rispettato o testati, l'uso a proprio rischio]

È quindi possibile passare darr come argomento per un kernel dall'host.