2013-04-09 44 views
1

我正在測試簡單內核的最大線程數是多少。我發現線程總數不能超過4096。代碼如下:特斯拉M2050上CUDA內核的最大線程數

#include <stdio.h> 
#define N 100 

__global__ void test(){ 
    printf("%d %d\n", blockIdx.x, threadIdx.x); 
} 

int main(void){ 
    double *p; 
    size_t size=N*sizeof(double); 
    cudaMalloc(&p, size); 
    test<<<64,128>>>(); 
    //test<<<64,128>>>(); 
    cudaFree(p); 
    return 0; 
} 

我的測試環境:CUDA 4.2.9特斯拉M2050。代碼編譯爲

nvcc -arch=sm_20 test.cu 

在檢查輸出是什麼時,我發現有些組合缺失。運行命令

./a.out|wc -l 

我總是得到4096當我檢查CC2.0,我只能找到的x,y,z尺寸上(1024,1024,512)和最大塊數的最大數目每個塊的線程數爲1024.並且對內核的調用(<<<64,128>>><<<128,64>>>)都在限制之內。任何想法?

注意:CUDA內存操作在那裏阻塞代碼,以便顯示內核的輸出。

回答

6

您正在濫用內核printf,並用它來判斷您可以運行多少個線程是完全無意義的想法。運行時對於printf輸出有一個有限的緩衝區大小,當您運行足夠的線程時,您只需將其與輸出進行溢出。有一個API來查詢和設置printf緩衝區大小,使用cudaDeviceGetLimitcudaDeviceSetLimit(感謝Robert Crovella的linkprintf文檔的註釋)。

通過查看文檔中的here,可以找到給定內核可以運行的最大線程數。

+0

device printf documentation is [here](http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#formatted-output)。 – 2013-04-09 05:01:22

+0

感謝talonmies和羅伯特。 – user2196452 2013-04-09 05:17:42