2013-01-02 98 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與設備上的10個成員的數組,分配,並將其複製到設備是這樣的:

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

[免責聲明:寫在瀏覽器的所有代碼,從不遵守或測試,風險自擔用途]

然後,您可以將darr作爲參數傳遞給主機的內核。