【问题标题】:Maximum number of threads for a CUDA kernel on Tesla M2050Tesla M2050 上 CUDA 内核的最大线程数
【发布时间】:2013-03-31 09:17:01
【问题描述】:

我正在测试一个简单内核的最大线程数。我发现线程总数不能超过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。并且对内核的调用(&lt;&lt;&lt;64,128&gt;&gt;&gt;&lt;&lt;&lt;128,64&gt;&gt;&gt;)都在限制范围内。有什么想法吗?

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

【问题讨论】:

    标签: cuda


    【解决方案1】:

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

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

    【讨论】:

    • 设备 printf 文档是 here
    • 感谢 talonmies 和 Robert。
    猜你喜欢
    • 2012-08-18
    • 2015-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-01
    • 2012-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多