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

Umb*_*lla 4 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];
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

我想通过使用cudaDeviceProp,我可以在GTX 580上的每个块的共享内存中使用最大49152bytes.

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

但我的程序出错.(8192bytes <49152bytes)

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

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

我无法理解每个块的共享内存的最大大小意味着什么.

给我建议.

cha*_*ang 13

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

  • @Umbrella你是对的,如果你有比多处理器更多的块,并不是所有的块都被同时处理.并且共享内存具有块的生命周期,因此当块完成时,共享内存被释放,当然可以由即将到来的块重用.有关详细信息,请参阅[此处](http://www.drdobbs.com/parallel/cuda-supercomputing-for-the-masses-part/208801731). (4认同)