2012-03-01 88 views
0

我運行了一些更新了浮點數組的CUDA代碼。我有一個包裝函數,就像這個問題How can I compile CUDA code then link it to a C++ project?中討論的函數一樣。在cuda代碼中循環

在我的CUDA功能創建一個像這樣循環......

int tid = threadIdx.x; 
for(int i=0;i<X;i++) 
{ 
    //code here 
} 

現在的問題是,如果X等於100的值,一切都運行得很好,但如果X等於到1000000,我的向量沒有得到更新(幾乎就好像for循環內的代碼沒有得到執行)

現在在wrapper函數中,如果我在for循環中調用CUDA函數,它仍然可以正常工作,(但由於某種原因,比僅僅在CPU上完成相同處理的速度慢得多)...

for(int i=0;i<1000000;i++) 
{ 
     update<<<NumObjects,1>>>(dev_a, NumObjects); 
} 

有誰知道爲什麼我可以在包裝函數中循環一百萬次,但不是簡單地調用一次CUDA「更新」函數,然後在該函數內啓動一個百萬的循環?

+2

[CUDA限制似乎已達到可能的重複,但是是什麼限制?](http://stackoverflow.com/questions/6913206/cuda-limit-seems-to-be-reached-but-what-限制是) – talonmies 2012-03-01 14:23:37

+0

當你使用X的較大值時,你的內核是否可以執行?你在做錯誤檢查嗎?你應該。 X是編譯時常量還是#define?如果是這樣,你是否使用適當的編譯器標誌來檢查共享和常量內存要求以及寄存器數量?那麼您是否使用NVIDIA CUDA佔用率計算器來研究其後果?許多事情可能會持續下去。 – Patrick87 2012-03-01 16:35:48

+0

謝謝帕特里克...... X只是一個變量,用於本文的目的。我通常用「1000000」等硬編碼值替換「x」。Talonmies有一個好帖子,我相信這就是爲什麼...... – Matthew 2012-03-01 21:35:29

回答

0

運行此應用程序後,您應該使用cudaThreadSynchronize和cudaGetLastError以查看是否有某個錯誤。我想象了第一次,它超時了。如果內核需要很長時間才能完成,則會發生這種情況。卡片就放棄了。

第二件事,它需要更長時間執行的原因是因爲每個內核啓動都有一個設定的開銷時間。當你在內核中有循環時,你會經歷一次開銷並運行循環。現在你經歷了X次。開銷相當小,但足夠大,儘可能多的循環應儘可能放入內核中。

如果X特別大,您可以考慮在內核中儘可能多地運行循環,直到它在安全的時間內完成,然後遍歷這些內核。