2015-01-26 122 views
2

我有關於以下問題的查詢:CUDA warp大小和控制發散

假設,我們有一個9×7的畫面(7個像素在x方向上和在y方向上的9個像素),多少經線將有控制背離假設4 * 4線程和每個warp 8線程塊?

塊和經紗在這裏將如何組織? x或水平方向,我可以假設每行2塊。類似地, 垂直方向,每塊3塊。但是,經線是如何組織的?有人可以指出經紗的線程ID以及發生控制分歧的情況(Thread ID等)。

感謝

+0

這個問題的整個前提是有缺陷的。在cuda中的經紗尺寸*總是* 32. – talonmies 2015-01-27 10:13:44

回答

7

假設,我們有一個9×7的畫面(7個像素在x方向上和在y方向上的9個像素),許多經紗將如何具有4×4級的線程控制發散假設塊每個warp有8個線程?

  1. 發散是程序(代碼)的屬性,而不是塊/經線佈局本身。如果您的算法在圖像中的所有像素上運行相同,那麼無論線程數量及其組織如何,都不會有任何分歧。如果你的算法在變形邊界上分支,那麼也不會有分歧。因此,沒有看到你的代碼,你的問題在技術上是無法回答的。
  2. 如果您正在運行16個線程和每個warp 8個線程(在CUDA硬件上這是物理上不可能的:warp由32個線程組成,並且它們的大小不可配置),那麼您可以運行根本沒有GPU。這些數字是方式太小,無法從任何硬件加速受益。

塊和經紗在這裏將如何組織?對於x或水平方向,我可以假設每行有2個塊。類似地,對於垂直方向,每列有3個塊。但是,如何組織經紗?

我會堅持你的榜樣,並嘗試提供線程ID,塊ID,變形ID的模式。請記住,實際上,這種佈局在CUDA硬件上是不可能的。

Image  Global Thread IDs  Block IDs    Local Thread IDs 
□□□□□□□ | 00 01 02 03 04 05 06 | 00 00 00 00 00 00 00 | 00 01 02 03 04 05 06 
□□□□□□□ | 07 08 09 10 11 12 13 | 00 00 00 00 00 00 00 | 07 08 09 10 11 12 13 
□□□□□□□ | 14 15 16 17 18 19 20 | 00 00 01 01 01 01 01 | 14 15 00 01 02 03 04 
□□□□□□□ | 21 22 23 24 25 26 27 | 01 01 01 01 01 01 01 | 05 06 07 08 09 10 11 
□□□□□□□ | 28 29 30 31 32 33 34 | 01 01 01 01 02 02 02 | 12 13 14 15 00 01 02 
□□□□□□□ | 35 36 37 38 39 40 41 | 02 02 02 02 02 02 02 | 03 04 05 06 07 08 09 
□□□□□□□ | 42 43 44 45 46 47 48 | 02 02 02 02 02 02 03 | 10 11 12 13 14 15 00 
□□□□□□□ | 49 50 51 52 53 54 55 | 03 03 03 03 03 03 03 | 01 02 03 04 05 06 07 
□□□□□□□ | 56 57 58 59 60 61 62 | 03 03 03 03 03 03 03 | 08 09 10 11 12 13 14 
---------------------------------------------------------------------------- 
Image  Global Warp IDs  Block IDs    Local Warp IDs 
□□□□□□□ | 00 00 00 00 00 00 00 | 00 00 00 00 00 00 00 | 00 00 00 00 00 00 00 
□□□□□□□ | 00 01 01 01 01 01 01 | 00 00 00 00 00 00 00 | 00 01 01 01 01 01 01 
□□□□□□□ | 01 01 02 02 02 02 02 | 00 00 01 01 01 01 01 | 01 01 00 00 00 00 00 
□□□□□□□ | 02 02 02 03 03 03 03 | 01 01 01 01 01 01 01 | 00 00 00 01 01 01 01 
□□□□□□□ | 03 03 03 03 04 04 04 | 01 01 01 01 02 02 02 | 01 01 01 01 00 00 00 
□□□□□□□ | 04 04 04 04 04 05 05 | 02 02 02 02 02 02 02 | 00 00 00 00 00 01 01 
□□□□□□□ | 05 05 05 05 05 05 06 | 02 02 02 02 02 02 03 | 01 01 01 01 01 01 00 
□□□□□□□ | 06 06 06 06 06 06 06 | 03 03 03 03 03 03 03 | 00 00 00 00 00 00 00 
□□□□□□□ | 07 07 07 07 07 07 07 | 03 03 03 03 03 03 03 | 01 01 01 01 01 01 01 
---------------------------------------------------------------------------- 

並且其中控制發散發生的情況下(線程ID等的那些)

如上所述,發散作爲代碼的屬性,而不是線程的佈局,這個問題不能沒有代碼回答。

+0

首先。非常感謝你的圖表。 (由於<15的聲望,我無法投票)。現在,我選擇了這個小尺寸(我知道這是不實用的),這樣就可以很容易地說明,如果有人會繪製圖表,就像您一樣。另外,對於行0(例如)和線程ID 4-6,假設BlockIdx.x,BlockIdx.y表示法以及水平x和垂直y,blockID將不是(1,0)嗎? – user915783 2015-01-27 06:45:51

+0

我使用線性符號,因爲它比(x,y)更容易表示,並且更容易看出它們分配了哪些翹曲。但是這是一種雙射:任何線性索引'i'都可以用'(x,y)'表示,反之亦然,使用'i = x + y * xDim'和'(x = i%xDim,y = i/xDim)'。因此,對於線程4-6,它們的座標是(1,0)和(1,2),在塊0中(因爲您沒有指定柵格暗淡而沒有座標)。 – 2015-01-27 07:24:22