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

use*_*452 1 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;
}
Run Code Online (Sandbox Code Playgroud)

我的测试环境:特斯拉M2050上的CUDA 4.2.9.代码编译用

 nvcc -arch=sm_20 test.cu
Run Code Online (Sandbox Code Playgroud)

在检查输出是什么时,我发现缺少一些组合.运行命令

./a.out|wc -l
Run Code Online (Sandbox Code Playgroud)

我总是得到4096.当我检查cc2.0时,我只能找到x,y,z维度的最大块数(1024,1024,512),每个块的最大线程数是1024.内核(<<<64,128>>>或者<<<128,64>>>)都处于极限状态.任何的想法?

注意:CUDA内存操作用于阻止代码,以便显示内核的输出.

tal*_*ies 6

你滥用内核printf,用它来判断你可以运行多少线程是一个完全没有意义的想法.运行时具有有限的printf输出缓冲区大小,当您运行足够的线程时,您只是将其与输出溢出.还有就是要查询和设置的API printf缓冲区大小,使用cudaDeviceGetLimitcudaDeviceSetLimit(感谢罗伯特Crovella为链接printf注释中的文档).

你可以找到一个线程给定内核可以通过查看运行的最大数量这里的文件中.