我正在测试简单内核的最大线程数。我发现线程总数不能超过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内存操作会阻止代码,以便显示内核的输出。
答案 0 :(得分:6)
您正在滥用内核printf
,并使用它来判断您可以运行多少个线程是一个完全没有意义的想法。运行时具有有限的printf
输出的缓冲区大小,并且当您运行足够的线程时,您只是用输出溢出它。有一个API可以使用printf
和cudaDeviceGetLimit
来查询和设置cudaDeviceSetLimit
缓冲区大小(感谢Robert Crovella提供printf
到{{1}}文档注释)。
您可以通过查看文档中的link找到给定内核可以运行的最大线程数。