2016-07-18 145 views
0

我正在嘗試配置以下nested thread architectureCUDA線程調度:自定義線程交換/基於事件的鎖?

| | | 
| | | 
||| ||| ||| 
|vv |vv |vv 
v v v 

主線程只嵌套線程都完成後繼續。

的問題是,在較大的結構我可能會碰到飢餓問題嵌套線程運行到目前有什麼用while循環標準互斥鎖定製。在程序加載GPU可以同時運行的更多線程之前,這不會成爲問題。有沒有辦法在基於互斥邏輯的活動線程之間進行交換?

回答

2

您提供的鏈接涵蓋CUDA動態並行性(CDP)。

在非CDP情況下,如果你打算使用互斥/鎖,這是程序員的責任,以確保所有必要的線程可以使向前進步。在活動線程之間沒有辦法「交換」。一旦線程由GPU調度程序激活,它必須能夠最終取得進展。它將消耗調度器插槽(SM上的插槽),直到它能夠這樣做。你不能改變這一點。

有在CDP的情況下例外,它適用於父內核和內核子(只)之間的關係。允許父內核啓動子內核,GPU線程調度程序將根據需要「交換」出父內核線程,以便子內核線程可以前進,最終滿足父線程中的implicitexplicit同步這取決於子網格的完成。

但是這個例外爲CDP父/子的情況下,並不意味着:

  1. 父線程將被換爲其他父線程(也許是那些旋轉的程序員編寫的鎖或互斥)
  2. 子線程將被換爲其他子線程

在網格中,無論是家長還是孩子,這是程序員的責任智能使用鎖或互斥,使必要的向前進展可以由網格製成,用希望CUDA運行時將交換在SM上分配了活動插槽的線程。

也沒有辦法明確迫使進出活躍SM插槽的線程的交換。隱式方法是已經討論過的CDP機制,並且還保證在特定網格內交換線程。 (關於流優先級,在當前的實現中,我不相信它會換掉當前調度的線程或線程塊,直到它們完成爲止。它實際上是一種機會主義調度控制,而不是先發制人調度控制,它將調度當SM上的機會可用調度時隙出現時,優先級較高的流中的線程塊會呈現自身,但是,AFAIK在CUDA執行模型中沒有任何內容明確地阻止流優先級交換出活動線程塊,因此它的行爲)

+0

我是否正確地閱讀了你的答案,因爲除了啓動子內核之外,還有另外一種方式可以從內核線程啓動線程? – user2255757

+1

不,我不知道另一種啓動除內核啓動過程以外的線程的方式,我不確定我的答案的哪一部分表明這一點。作爲內核啓動的一部分的「啓動」線程在GPU線程調度器將其分配給特定SM上的可用插槽之前不會變爲「活動」。您(通常)無法控制此調度過程。 –

+0

我一定沒有明白CDP足以把握你對非CDP與CDP的解釋。 是否有線程合併? – user2255757