簡體   English   中英

CUDA中的線程和塊結構以及如何分配不同結構的線程(c++)

[英]Thread and block structure in CUDA and how to allocate threads with different structures (c++)

我剛剛開始學習 cuda 和並行編程,我很難用它。 如果我像這樣聲明線程塊的大小和結構:

addKernel << < 1, 5 >> > (dev_c, dev_a, dev_b);

有人可以解釋我將如何聲明以下內容:

1)One 2D block
2)One 3D block
3)multiple 2D block in 1D block grid
4)multiple 2D block in 2D block grid
5)multiple 2D block in 3D block grid
6)multiple 3D block in 1D block grid

以及如何添加 2 個大小為 2^23-1 的較大數組大小。 我不明白上述術語的含義以及如何在上面的 CUDA addKernel 行中表示它們。

const int arraySize = 2^23-1;
int a[arraySize] = { 0 };
int b[arraySize] = { 0 };
int c[arraySize] = { 0 };

上面我已經定義了數組大小並初始化了a、b和c。 我正在嘗試編寫代碼來並行添加 a 和 b 的內容並將結果存儲在 c 中。 我將如何以上述方式塑造線程結構並在線程之間拆分任務? 謝謝你。 我試圖通過實現組織線程和塊的不同方式來進一步理解線程層次結構。

執行配置的左側( <<<... >>> )為您提供網格維度(即網格中的塊數),右側是塊維度(即塊中的線程數)。 請注意,在運行時 API kernel 啟動語法中可能有多達四個 arguments,但最后兩個與此討論無關。

所以一些例子:

  1. 在 x 和 y 方向分別有 2 個線程的單個 2D 塊: <<< 1, dim3(2, 2) >>> (注意dim3的默認值為 1)

  2. 單個 3D 塊: <<< 1, dim3(2, 2, 2) >>>

  3. 1D 網格中的多個 2D 塊: <<< 4, dim3(2, 2) >>> (“四個 2D 塊”)

  4. 2D 網格中的多個 2D 塊: <<< dim3(3, 3), dim3(2, 2) >>> (“x 方向三個 2D 塊,y 方向三個”)

  5. 3D 網格中的多個 2D 塊: <<< dim3(3, 4, 5), dim3(2, 2) >>> ("x-dir 中的三個 2D 塊,y-dir 中的四個,z-dir 中的五個" )

  6. 一維網格中的多個 3D 塊: <<< 5, dim3(2, 2, 2) >>> (“五個 3D 塊”)


至於你的后一個問題(對不起,這有點長):

通常,您只需要一個維度。 2D 和 3D 只是為某些問題提供便利(例如,2D 用於卷積)。 因此,您如何選擇尺寸取決於問題。

還要記住,每個塊的線程數非常有限(x 和 y 維度通常為 1024……現在不確定 z,但關鍵是每個塊不能有那么多)。

對於您的添加,您最終會執行以下操作:您決定每個塊需要多少線程,例如numThreads (我認為建議使用 32 的倍數,例如 32 或 256),然后將塊數計算為ceil(n / numThreads)其中n是數組的大小。 這可確保您至少擁有與數組中的元素一樣多的線程。

例如。 如果您的數組有n = 1000元素,並且您決定 go 為numThreadsPerBlock = 32 ,您將得到ceil(1000 / 32) = ceil(31.25) = 32塊。 這意味着您的 kernel 將以numBlocks * numThreadsPerBlock = 32 * 32 = 1024線程啟動。 由於現在線程比元素多,因此您可能需要通過 kernel 中的某些條件來檢查這一點: if(idx < n) add()

在您的示例中,應該使用一維網格和一維塊。 您可能希望每個塊有很多線程(例如 256 或 1024),否則您可能會超出設備的塊限制,因為在您的示例中n非常大。

my_addition_kernel <<< ceil((2^23 - 1) / 1024), 1024 >>>(da, db, dc)

所以你會有 8192 個塊,每個塊有 1024 個線程。

(有時您不能一次將所有內容都放入設備中。然后您必須對 go 進行一些不同的處理,例如對子數據進行多次迭代。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM