2012-07-16 77 views
3

我想自己解决这个问题,但是我不能。 所以我想得到你的建议。CUDA共享内存大小意味着什么

我在写这样的内核代码。 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)个字节,是吗?

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

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

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

我使用的“printf”的内核,看看是否还有工作或没有,但若干块不工作。 (尽管我创建了1085个块,但实际上只有50〜100个块运行。)

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

我无法明白每块的最大共享内存大小的含义。

给我建议。

+0

希望共享内存的大小是2 * threadNum * sizeof(int),否则你的问题不是要求太多的共享内存,它太少了。 – talonmies 2012-07-16 06:10:30

回答

11

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

+0

非常感谢。这是我想要的答案。我还有一个问题。 (我很抱歉...)是否可以重用共享内存空间?我的意思是将在处理器上执行的线程块可以使用前面已完成其作业的线程块正在使用的共享内存空间。 (对于我可怜的英语,我很抱歉) – Umbrella 2012-07-18 06:14:53

+0

尽管单个多处理器在内核代码中有N个块,但我认为实际上N个块不会一次运行。所以我认为多处理器选择线程块的顺序是第一个和下一个。 – Umbrella 2012-07-18 06:28:04

+1

@Umbrella你说得对,如果你的块比多处理器多,那么并不是所有的块都被同时处理。并且共享内存有块的生命周期,所以当块完成时,共享内存被释放,当然可以被后续块重新使用。有关更多信息,请参见[此处](http://www.drdobbs.com/parallel/cuda-supercomputing-for-the-masses-part/208801731)。 – chaohuang 2012-07-18 15:56:44