2014-11-06 72 views
5

我想分析一些我在網上找到的代碼,並且不斷思考自己到了一個角落。我正在看一個直方圖內核推出與以下參數瞭解此CUDA內核啓動參數

histogram<<<2500, numBins, numBins * sizeof(unsigned int)>>>(...); 

我知道參數是網格,塊,共享內存大小。

那麼這是否意味着每個線程有numBins個線程的2500個塊,每個塊還有一個numBins * sizeof(unsigned int)塊的共享內存可用於其線程?

另外,在內核本身內部有__syncthreads()的調用,那麼在內核調用的過程中,有沒有2500組調用__syncthreads()

+2

第一個問題:是的。第二個問題:這些2500塊內的線程獨立於其他塊中的線程,將進入'__syncthreads()'點,直到塊中的所有線程完成對共享內存的更新直到該點到達,並且然後繼續執行更多指令。塊內的所有線程都必須看到'__syncthreads()',所以你可以說有'2500個'numBins'對'__syncthreads()'*的調用,但它與通常的函數調用不同。這是塊內線程同步的屏障程序。 – Farzad 2014-11-06 06:31:03

回答

4

那麼這意味有numBins線程每2500塊, 每個塊還具有提供給它的線程 共享存儲器numBins *的sizeof(無符號整數)塊?

CUDA Toolkit documentation

執行配置(一個全局函數調用的)是通過插入的形式<<<Dg,Db,Ns,S>>>,其中的表達式來指定:

  • Dg的爲dim3 )指定網格的尺寸和大小。
  • Db的爲dim3)指定的每個塊
  • Ns個爲size_t)的尺寸和大小指定了動態地分配每塊該呼叫在共享存儲器的字節數除了靜態分配的內存。
  • 小號cudaStream_t)指定相關的數據流,是一個可選參數缺省值爲0

所以,作爲@Fazar指出,答案是肯定的。該內存按塊分配。

此外,內核中有到__syncthreads()調用,是 有那麼2500套numBins的在 當然,內核調用的調用__syncthreads()?

__syncthreads()等待,直到線程塊中的所有線程都達到了這一點。用於協調同一塊中的線程之間的通信。

所以,每塊有一個__syncthread()調用。