cuda - 每 block 最大线程数与共享内存大小

标签 cuda gpgpu gpu-shared-memory

共享内存的大小每个 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 有更多线程时,共享内存的最大数量保持不变。

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

关于cuda - 每 block 最大线程数与共享内存大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20882255/

相关文章:

windows - 如何以编程方式杀死 CUDA 内核

c - Cuda C 上任意大小的矩阵转置(具有共享内存)

gpu - GPU共享内存很小-我该怎么办?

cuda - 如何创建 CUDA 上下文?

linux - Cuda 编译器不适用于 GCC 4.5 +

CUDA - 为傻瓜使用 CURAND 库

web - 我应该使用哪种 WebCL 原型(prototype)?

cuda - 使用 Nvidia 平台为 OpenCL 配置本地(共享)内存

cuda - 如何从已编译的 CUDA 中删除所有 PTX 以防止知识产权泄漏

cuda - 检测指针是否指向CUDA中的设备或主机