cuda - CUDA 共享内存大小意味着什么

标签 cuda shared-memory

我正在尝试自己解决这个问题,但我不能。
所以我想听听你的建议。

我正在编写这样的内核代码。 VGA 是 GTX 580。

xxxx <<< blockNum, threadNum, SharedSize >>> (... threadNum ...)
(note. SharedSize is set 2*threadNum)

__global__ void xxxx(..., int threadNum, ...)
{
    extern __shared__ int shared[];
    int* sub_arr = &shared[0];
    int* sub_numCounting = &shared[threadNum];
    ...
}

我的程序创建了大约 1085 个块和每个块 1024 个线程。

(我正在尝试处理巨大的数组)

所以每个块的共享内存大小是 8192(1024*2*4)bytes,对吧?

我发现通过使用 cudaDeviceProp,我可以在 GTX 580 上每个块的共享内存中使用最多 49152 字节。

而且我知道 GTX 580 有 16 个处理器,线程块可以在处理器上实现。

但是我的程序出现错误。(8192bytes < 49152bytes)

我在内核中使用“printf”来查看是否运行良好,但有几个块没有运行。 (虽然我创建了 1085 个块,但实际上只有 50~100 个块在运行。)

我想知道在同一处理器上运行的块是否共享相同的共享内存地址。 (如果没有,为共享内存分配其他内存?)

我当然无法理解每个块的共享内存的最大大小是什么意思。

给我建议。

最佳答案

是的,同一多处理器上的块共享相同数量的共享内存,对于您的 GPU 卡(计算能力 2.0),每个多处理器 48KB。因此,如果在同一个多处理器上有 N 个块,则每个块的共享内存的最大大小为 (48/N) KB。

关于cuda - CUDA 共享内存大小意味着什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11498769/

相关文章:

c++ - YDL.net 的 Eclipse CUDA 插件是否已为 CUDA 4.0 做好准备

cuda - 防止 CUDA 中的内核调用后析构函数调用

c - 如果我使用 select() 服务器编写一个对等 2 个对等应用程序而不使用 fork()、线程、共享内存、信号量,这样可以吗?

c - SysV 信号量是否在文件系统中表示?

C - 使用 mmap 通过共享内存读取整数

c++ - 具有动态共享内存的模板化 CUDA 内核

c++ - 用于 CUDA 的 x64 与 x86

c - 使用 Cuda-C 查找表

c++ - 调试共享内存的内容

python-3.x - Python 3 的进程之间共享多维数组