2016-12-05 103 views
0

CUDA編程指南分爲以下的說:CUDA線程是否以O(n)操作的鎖步執行?

的經執行一次一個共同的指令,所以,當經紗的所有32個線程的執行路徑上同意達到最高效率。如果warp的線程通過依賴於數據的條件分支發散,則warp會連續執行所採用的每個分支路徑,禁用不在該路徑上的線程,並且當所有路徑完成時,線程會聚到相同的執行路徑。

我在想,因爲一個共同的指令在一個時間鎖步。

  1. 那麼在沒有分支並且每個線程需要計算O(n)操作的情況下會發生什麼?
  2. 如果他們操作的數據值較小,那麼warp中的某些線程是否會在其他線程之前完成?
  3. 如果某些線程在其他線程之前完成,它們保持空閒狀態,直到其他線程完成?
+0

指南指的是O(1)(至少在理論上)的具體機器指令。您的O(n)操作由機器指令組成。爲了在其他人之前進行經紗整理,您需要爲他們提供不同的數據。這隻適用於一個分支(除非我在這裏錯了,而你有一個反例)。 – Drop

+0

這正是我想要發現的;如果他們用不同的數據餵食,會在別人之前完成線程處理? – John

+0

我的觀點是:你不能在沒有分支的情況下飼餵不同的東西(即(1)中的假設是錯誤的)。並且在分支的情況下,每條路徑長度相同並且被序列化。無論如何,線程同時完成。 – Drop

回答

3

warp中的每條指令都是以鎖步執行的。下一條指令只能在前一條指令完成時才能讀取。 如果一條指令需要不同線程的時間量(例如,一個線程從緩存中加載數據,而另一個線程等待全局內存讀取),則所有線程都必須等待。

這就是說,我不知道任何單一的指令具有複雜性O(n)。您可能指的是由warp中的每個線程執行的大小爲n的循環。與任何其他控制流構造一樣,Loop具有條件跳轉。早期退出循環的線程將被屏蔽並等待線程仍在循環中。當所有線程都表示他們想要退出時,它們會匯合,並且以下操作再次以完美的同步進行。

相關問題