2012-11-19 59 views
-2

我對線程編號和線程標識沒有多少懷疑。線程ID和標識

  1. 2D-螺紋(1,0)是線程1中,作爲它的x索引爲1和y索引爲0然後是螺紋(0,1)這是什麼的線程的線程ID或線程數?我感覺它是3,但是怎麼樣?我們如何應用線程(0,1)的ThreadId = blockIdx.x * blockDim.x + threadIdx.x的公式?我如何使用這個公式來計算線程(0,1)的線程ID值,用於說明塊3?或者有不同的公式,如何找到?如何爲3D做?

  2. 我們如何確定總數? x方向的線程在一起? 例如:如果我正在訪問矩陣元素。矩陣大小是3,然後我明白,線程(0,0)將訪問第一個元素,線程(1,0)將訪問第二個元素,線程(2,0)將訪問第三個元素,然後線程(0,1)將訪問第二行的第一個元素(第四個元素)。 但是如何從這張圖片忽略線程(3,0)?哪個元素線程(3,0)將訪問以及如何? 這取決於執行配置,我給了塊大小和網格大小?

+4

請參閱CUDA C編程指南中的「2.2線程層次結構」。 – talonmies

+1

每個問題請提出一個問題:http://stackoverflow.com/faq –

+0

@PaulR。哦好的。當然。每個問題我會提出一個問題。 – robot

回答

2

threadIdx是一個帶有.x,.y和.z字段的結構。把它寫成「thread(x,y)」可能會讓人困惑。

  1. 您正在創建2D線程塊並嘗試將其映射到1D索引。當然,您可以,但2D到1D映射將取決於您的應用程序的上下文。大多數人會使用一維,如果他們真的想要一維索引!

    當然,您可能需要採用2D線索索引並訪問線性數組,但數組的佈局又將取決於應用程序。一個典型的例子就像offset = threadIdx.y * arraywidth + threadIdx.x

  2. x方向的線程總數爲gridDim.x * blockDim.x

    給定線程訪問哪個元素取決於您如何選擇計算偏移量(請參閱(1))。

Talonmies還指出了文檔的Thread Hierarchy部分,這是一個很好的開始。

+0

感謝您的回覆,我一定會通過Talonmies指出的線程層次部分。 1)但是,實際上,我仍不清楚這個概念。實際上,我並不是想通過一維貼圖進行2D。相反,我想知道線程(0,1)的線程ID(線程號的線程值)是什麼? 2) 2a)此外,無論我是使用1D,2D還是3D線程塊訪問,所有元素都將線性放置在內存中。 2b)如果'x'方向的總元素是gridDim.x * blockDim.x,那麼對於2D線程塊,總數是多少? 'y'方向的線程?我應該總結一下嗎? – robot

+1

@robot:FOr(1)如果你想要一個線性線程ID,那麼你爲什麼使用2D塊/網格?只需使用一維繫統並完成它。檢查vectorAdd示例。對於(2b),每個維度中的總線程使用相同的公式'gridDim.P * blockDim.P',其中P是{x,y,z}。 – Tom

+0

感謝您的回覆。我在教科書中讀到,1D或2D中的每個線程都有唯一的線程ID,例如:如果它是1D,則可以使用blockIdx * blockDimx + threadIdx計算值;例如:塊1的總共10個線程/塊線程0將具有線程ID = 10 * 0 + 0 = 0,並且塊1的線程0將具有線程ID = 10 * 1 + 0 = 10。我問,如果案件是2D線程,那麼如何找到唯一的線程ID? – robot