每个块的最大线程数与共享内存大小

时间:2014-01-02 11:48:19

标签: cuda gpgpu

共享内存的大小每个块的最大线程数之间是否存在任何关系?在我的情况下,我使用每个块的最大线程数= 512 ,我的程序使用所有线程,它使用了大量的共享内存。

每个线程都必须重复执行特定任务。例如,我的内核可能看起来像,

 int threadsPerBlock = (blockDim.x * blockDim.y * blockDim.z);
 int bId = (blockIdx.x * gridDim.y * gridDim.z) + (blockIdx.y * gridDim.z) + blockIdx.z;
 for(j = 0; j <= N; j++) {
     tId = threadIdx.x + (j * threadsPerBlock);
     uniqueTid = bId*blockDim.x + tId;
     curand_init(uniqueTid, 0, 0, &seedValue);
     randomP = (float) curand_uniform( &seedValue );
     if(randomP <= input_value) 
          /* Some task */
     else
          /* Some other task */
  }  

但我的线程不会进入下一次迭代(比如j = 2)。我错过了一些明显的东西吗?

2 个答案:

答案 0 :(得分:2)

您必须区分shared memoryglobal memory。前者总是按块。后者指的是GPU上可用的片外存储器。

所以一般来说,线程有一种关系,即每个块拥有更多线程时,共享内存的最大数量保持不变。

另请参阅例如Using Shared Memory in CUDA C/C++

答案 1 :(得分:2)

每个块的最大线程数与共享内存的大小之间存在没有直接关系(不是“设备内存” - 它们不是同一个东西)。

但是,存在间接关系,因为不同的Compute Capabilities,这两个数字都会发生变化:

Compute Capability             1.x    2.x - 3.x
---------------------------------------------------
Threads per block              512    1024
Max shared memory (per block)  16KB   48KB

因为其中一个增加了新的CUDA设备,另一个增加了。

最后,有一个块级资源受到启动更多线程的影响,用完了:寄存器文件。所有块线程共享一个寄存器文件,约束为

  

ThreadsPerBlock x RegistersPerThread&lt; = RegisterFileSize

确定内核代码使用了多少个寄存器并非易事;但根据经验,如果你使用“很多”局部变量,函数调用参数等,你可能会达到上述限制,并且无法安排多少线程。