共享内存的大小和每个块的最大线程数之间是否存在任何关系?在我的情况下,我使用每个块的最大线程数= 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)。我错过了一些明显的东西吗?
答案 0 :(得分:2)
您必须区分shared memory
和global memory
。前者总是按块。后者指的是GPU上可用的片外存储器。
所以一般来说,线程有一种关系,即每个块拥有更多线程时,共享内存的最大数量保持不变。
答案 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
确定内核代码使用了多少个寄存器并非易事;但根据经验,如果你使用“很多”局部变量,函数调用参数等,你可能会达到上述限制,并且无法安排多少线程。