1

我正在测试一个简单内核的最大线程数。我发现线程总数不能超过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 内存操作用于阻止代码,以便显示内核的输出。

4

1 回答 1

6

你在滥用内核printf,用它来判断你可以运行多少个线程是一个完全荒谬的想法。运行时的输出缓冲区大小有限printf,当您运行足够多的线程时,您只是在输出溢出。有一个 API 用于查询和设置printf缓冲区大小,使用cudaDeviceGetLimitand cudaDeviceSetLimit(感谢 Robert Crovella在评论中提供的文档链接printf)。

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

于 2013-04-09T04:59:14.613 回答