2013-03-13 42 views
1

我想爲我的一個算法使用動態並行機制,我用12個塊* 512線程從CPU啓動一個內核,我想知道如果我將使用動態並行機制,每個線程將啓動新的內核。每個線程是否啓動動態並行?

void main(){ 
dynamic<<<12,512,0>>>(x,y,z); 
} 

__global__ void dynamic(int x,int y, int z){ 
preprocessing<<<1,100>>>(x,y); 
} 

__global__ void preprocessing(int x,int y){ 

//do stuff 
} 

這是否意味着我的每個〜6000線程都會嘗試啓動100個線程?或者是我的第一個動態內核將暫停所有〜6000線程,啓動100個線程並返回結果由我的6000個前面的線程處理?

如果是的話,我可以簡單地使用100個線程嗎?我應該使用像

if(tid==1){ 
preprocessing<<<1,100>>>(x,y) 
} 

回答

4

有一個條件,你的第一個實例,每次遇到內核啓動線程將推出它自己的內核。設備內核啓動是異步的,即控制立即返回到調用線程,就像在主機上一樣。所以沒有線程暫停。

如果你只想從父內核啓動一個子內核,你的第二個方法就可以工作。您可能想要閱讀dynamic parallelism programming guide。您可以使用編程準則部分中給​​出的簡單示例進行操作,並修改內核啓動參數以查看啓動的一個或多個子內核。

有關異步設備內核啓動的說明,請參閱編程指南的第11頁。

+0

這是否意味着一些緩慢的起伏?例如我的預處理在CPU上安靜得很快,所以如果我通過動態並行處理在GPU上運行它,會產生一些後果嗎? – Anoracx 2013-03-13 20:06:24

+0

我修改了這個例子,因爲我想知道所有的線程如何看到數據,而不僅僅是線程0.這在前面引用的Dynamic Parallelism指南的第1行第7頁得到了回答。 – Anoracx 2013-03-13 20:13:52

+0

我真的不知道。你可能不得不測試兩種情況,看看哪個更快。我確信有些事情可以在GPU上運行得更慢,比如[this example](http://stackoverflow.com/questions/14855408/dynamic-programming-in-cuda-global-memory-allocations-以交換數據,有智)。但是與大多數GPU編碼一樣,如果有很好的並行機會可以利用,它可能會在GPU上運行得更快。 – 2013-03-13 20:15:12

相關問題