2011-11-16 136 views
3

我知道在CUDA內核中沒有辦法使用std類,如字符串,向量,映射或集合。但是,沒有它們是非常不舒服的。我必須在CUDA內核中編寫大量代碼,所以我想至少使用字符串和向量。我不是在談論推力。我希望能夠寫出這樣的事:CUDA內核中的STD類

__global__ void kernel() 
{ 
    cuda_vector<int> a; 
    for(int i=0;i<10;i++) 
     a.push_back(i); 
} 

int main() 
{ 
    kernel<<<1,512>>>(); 
    return 0; 
} 

這將創建512個線程以及每個線程我想創建cuda_vector類,並把它作爲標準::向量。我在互聯網上沒有找到任何解決方案,我開始寫自己的課程。這個類的每個函數都被定義爲「__ host __」和「__ device __」函數,以便我可以在CPU和GPU上使用它。 理論上,它可以實現,但只能在費米架構上實現。因爲,我們需要動態分配內存。我有GTX 580,並開始寫我自己的矢量。但這很累人,需要很多時間。沒有我可以使用的任何實現嗎?我無法相信沒有任何東西。沒有它,很多軟件開發人員在CUDA上編寫代碼嗎?沒有人試圖寫他/她自己的版本?

+0

只要知道這樣的事情對於表現並不會很好。閱讀Cuda C編程指南和最佳實踐指南,您將理解爲什麼。 – jmsu

+0

我明白這一點。但是,我很少需要字符串和向量。我的意思是,在計算密集的部分,我不必使用它們。所以,它不會影響性能太多。 –

回答

0

我沒有用它,但CuPP framework可能是你的興趣,尤其是vector<T>實施。看起來它可以做你需要它做的事情。

+0

感謝您的回答。如果我在forums.nvidia.com上提問,我可能需要等待幾天的答案(有經驗...)但是,這不是我需要的。這個cupp :: vector 用於宿主代碼。我只想在內核本身使用矢量,而不是在它之外。 –

2

你找不到類似std :: vector for cuda的原因是性能。您的傳統矢量對象不適合CUDA模型。如果您打算只使用512個線程,並且每個人都將管理std :: vector類似的對象,那麼性能將比在CPU上運行相同的代碼更糟糕。

GPU線程不喜歡CPU線程,就應該儘可能地輕。使用線程塊和共享內存使線程協作。如果你正在操縱一個字符串,每個線程都應該在一個字符上工作,如果你正在使用CPU中的矢量向GPU傳遞一個數組,並且每個線程都在一個元素上工作。基本上,考慮如何解決CUDA編程模型的問題,以便用CPU方法解決問題,然後將其轉換爲CUDA。

+0

我知道這兩個模型之間的區別。我想我應該解釋爲什麼我需要它。讓我們想象我有一個很大的任務,對於許多不同的數據需要完成相同的事情(〜10000)。由於此任務現在正在執行,因此CPU對這些10000個不同的數據執行相同的工作。現在,我想爲不同的cuda核心傳播這些數據,但不想過多地更改代碼。所以,每個核心都會做很多事情,但它會同時完成。因此,如果CPU有10000個矢量並且按順序執行操作,則GPU將並行執行操作。我敢打賭它會更快:) –