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

特斯拉M2050上CUDA内核的最大线程数,cuda,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);

我正在测试一个简单内核的最大线程数。我发现线程总数不能超过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;
}
在检查输出时,我发现缺少一些组合。运行命令

./a.out|wc -l
我总是得到4096分。当我检查cc2.0时,我只能找到x、y、z尺寸的最大块数为(10241024512),每个块的最大线程数为1024。并且对内核的调用(无论是
还是
)都在极限范围内。有什么想法吗


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

您正在滥用内核
printf
,使用它来判断您可以运行多少线程是完全没有意义的想法。运行时对于
printf
output有一个有限的缓冲区大小,当您运行足够多的线程时,您的输出就会溢出缓冲区。有一个API可以使用
cudaDeviceGetLimit
cudaDeviceSetLimit
查询和设置
printf
缓冲区大小(感谢Robert Crovella在注释中提供了
printf
文档)


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

您正在滥用内核
printf
,用它来判断可以运行多少线程是完全没有意义的想法。运行时对于
printf
output有一个有限的缓冲区大小,当您运行足够多的线程时,您的输出就会溢出缓冲区。有一个API可以使用
cudaDeviceGetLimit
cudaDeviceSetLimit
查询和设置
printf
缓冲区大小(感谢Robert Crovella在注释中提供了
printf
文档)


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

设备printf文档是。感谢talonmies和Robert。设备printf文档是。感谢talonmies和Robert。
./a.out|wc -l