2016-11-05 51 views
-1

一般問題:線程的數量必須等於我想要處理的元素的大小?例如:如果我有矩陣M [a] [b]。我必須分配(aXb)線程,或者我可以分配比我需要的更多的線程(比ab更多)?因爲專注於元素aXb + 1的線程會將我們拋出,不是嗎?或者解決方案是放置一個條件(只有在範圍(ab))?關於在cuda中組織線程

具體問題:let是M [x] [y] x行y列的矩陣。考慮1000 < = x < = 300000和y < = 100.我如何以這種方式組織線程,這對於x和y的每個輸入都是通用的。我希望每個線程都會關注矩陣中的一個元素。 CC = 2.1謝謝!

+0

您可以分配更多,或者甚至可以分配更少。任何一種方法都可以工作。如果你分配的線程多於所需的線程數,你的內核應該包含一個條件測試來確保每個線程都在有效的數據上運行。如果你分配的線程少於所需的線程數,你的內核應該包含[某種類型的循環](https://devblogs.nvidia.com/parallelforall/cuda-pro-tip-write-flexible-kernels-grid-stride-loops/ )涵蓋所有數據項目。 –

回答

1

一般的答案:這取決於一個問題。

在大多數情況下,自然有人對一個問題線程的網格的映射是好的下手,但你要記住的是:

  1. 實現高入住率。
  2. 最大限度地提高GPU資源使用率和內存吞吐量。
  3. 使用有效數據。

有時它可能需要使用單線程來處理許多元素或許多線程來處理單個元素。例如,您可以想象需要應用於元素數組的一系列獨立操作A,B和C.你可以運行三個不同的內核,但是分配網格可能會比元素多三倍,並且通過網格(或其他)的一個維度區分操作。另一方面,您可能會遇到一個問題,可能會最大限度地利用共享內存(例如轉換圖像) - 您可以使用16個線程塊來處理5x5圖像窗口,其中每個線程將計算每個2x2切片的統計信息。

選擇是你的 - 最好的建議並不總是明顯的。嘗試不同的方法並選擇最適合的方法。