共享内存的大小和每个 block 的最大线程数之间有什么关系吗?在我的例子中,我使用每个 block 的最大线程数= 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)。我在这里遗漏了一些明显的东西吗?
最佳答案
您必须区分共享内存
和全局内存
。前者总是按 block 计算。后者指的是 GPU 上可用的片外内存。
所以一般来说,线程之间存在一种关系,即当每个 block 有更多线程时,共享内存的最大数量保持不变。
关于cuda - 每 block 最大线程数与共享内存大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20882255/