2013-04-15 53 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錯誤檢查。

回答這個問題,您不能直接使用基於設備的類中的指針從主機分配存儲空間。這是因爲cudaMalloc期待一個普通的基於主機的指針存儲,比如你會得到什麼:

int *hostdata; 

cudaMalloc不能用指針,其存儲已經在設備上工作。這將無法工作:

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

因爲它需要在解引用主機代碼的裝置指針(d_c),這是不允許的。

+0

確定只有一個問題:我看到的是,您在設備上分配一些內存,然後將指針值複製到對象內的數組。爲什麼我不能直接爲myobject.array分配而不是使用「中間」變量來保存數據並將其指針複製到myobject.array中? –

+0

回覆這個問題,並編輯我的答案。我相信我已經解決了這個問題,並且在其中一個鏈接答案後發佈了問題。 –

+0

非常感謝,非常明確的答案! 還有一個問題,如果我可以:爲什麼我不能做 CudaMalloc((void **)&data,100 * sizeof(int)) 在構造函數中而不是data = new int [100] ? 我認爲應該直接在設備上分配,而不是在主機上,然後複製到設備。 乾杯 –

相關問題