特斯拉M2050上CUDA内核的最大线程数

时间:2013-04-09 04:49:04

标签: cuda

我正在测试简单内核的最大线程数。我发现线程总数不能超过4096.代码如下:

#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;
}

我的测试环境:Tesla M2050上的CUDA 4.2.9。代码用

编译
 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内存操作会阻止代码,以便显示内核的输出。

1 个答案:

答案 0 :(得分:6)

您正在滥用内核printf,并使用它来判断您可以运行多少个线程是一个完全没有意义的想法。运行时具有有限的printf输出的缓冲区大小,并且当您运行足够的线程时,您只是用输出溢出它。有一个API可以使用printfcudaDeviceGetLimit来查询和设置cudaDeviceSetLimit缓冲区大小(感谢Robert Crovella提供printf到{{1}}文档注释)。

您可以通过查看文档中的link找到给定内核可以运行的最大线程数。