2012-12-06 39 views
6

我正在使用CUDA 5.0和Compute Capability 2.1卡。CUDA內核作爲類的成員函數

這個問題很簡單:內核可以是類的一部分嗎? 例如:

class Foo 
{ 
private: 
//... 
public: 
__global__ void kernel(); 
}; 

__global__ void Foo::kernel() 
{ 
//implementation here 
} 

如果沒有,那麼解決的辦法是做一個包裝函數是類的成員,並在內部調用內核?

如果是的話,那麼它將作爲一個普通的私人功能訪問私有屬性? (我不只是試着看,會發生什麼,因爲我的項目現在有幾個其他的錯誤,我認爲這是一個很好的參考問題。我很難找到使用C++的參考。功能的例子可以找到,但沒有針對結構化代碼的策略。)

+0

如果你真的想把一個內核與一個類關聯起來,可以考慮把一個指向'__global__'函數的指針作爲(靜態或常規)數據成員,或者讓一個getter函數返回它。 – einpoklum

回答

3

讓我在討論中留下cuda動態並行性(即假設計算能力3.0或之前)。

請記住__ global__用於將(僅)從主機調用(但在設備上執行)的cuda函數。如果你在設備上實例化這個對象,它將不起作用。此外,爲了讓設備可訪問的私有數據對成員函數可用,必須在設備上實例化對象。

所以你可以有一個內核調用(即mykernel<<<blocks,threads>>>(...);嵌入在主機對象的成員函數,但是內核的定義(即與__ global__裝飾功能的定義)通常會先於對象定義在源代碼。如前所述,這種方法不能用於在設備上實例化的對象,也不能訪問在對象中其他地方定義的普通私有數據(可能會想出一個用於主機專用的對象,它使用全局內存中的指針創建設備數據,然後可以在設備上訪問,但這種方案乍看起來似乎相當複雜。)

通常,設備可用的成員函數將由__ device__裝飾器開頭。在這種情況下,設備成員函數中的所有代碼都在調用它的線程內執行。

This question給出了一個C++對象示例(在我的編輯答案中),它具有可從主機和設備調用的成員函數,並在主機和設備對象之間進行適當的數據複製。