2014-10-06 63 views
2

我與CUDA一個初學者,和我的同事總是設計的內核具有以下包裝:我應該檢查內核代碼中的線程數量嗎?

__global__ void myKernel(int nbThreads) 
{ 
    int threadId = blockDim.x*blockIdx.y*gridDim.x //rows preceeding current row in grid 
      + blockDim.x*blockIdx.x    //blocks preceeding current block 
      + threadIdx.x; 

    if (threadId < nbThreads) 
    { 
     statement(); 
     statement(); 
     statement(); 
    } 
} 

他們覺得有一些地方CUDA可能推出比對準/變形的緣故指定的多個線程的情況,所以我們需要每次檢查一次。 但是,到目前爲止,我沒有看到互聯網上的示例內核,他們實際上在進行此驗證。

CUDA實際上是否可以啓動比指定塊/網格尺寸更多的線程?

回答

4

CUDA不會啓動比塊/網格維度指定的線程更多的線程。

但是,由於塊尺寸的粒度(例如,希望塊尺寸爲32的倍數,並且其尺寸被限制爲1024或512),通常情況是難以匹配一個線程網格在數值上等於所需的問題大小。

在這些情況下,典型行爲是啓動更多線程,根據塊粒度有效地舍入到下一個偶數大小,並在內核中使用「線程檢查」代碼以確保「額外線程「,即超出問題大小的那些人,不要做任何事情。

在你的榜樣,這可以通過書面形式澄清:

__global__ void myKernel(int problem_size) 


    if (threadId < problem_size) 

其傳達什麼意圖,即只有對應於問題的規模(這可能不符合啓動網格大小)的線程做任何實際工作。

作爲一個非常簡單的例子,假設我想對一個長度爲10000個元素的矢量做矢量加法。 10000不是32的倍數,也不是小於1024的倍數,所以在典型的實現中,我會啓動多個線程塊來完成這項工作。

如果我想每個threadblock是32的倍數,沒有數threadblocks我可以選擇,這將給我到底10000線程。因此,我可以在一個線程塊中選擇256個線程,並啓動40個線程塊,總共給出10240個線程。使用線程檢查,我可以防止「額外」240線程執行任何操作。

相關問題