2012-03-21 106 views
6

我有以下内容(片段)。当它是静态的(甚至相同的大小)它非常快,但是当CurrentProbs是动态分配的(如上)时,性能很糟糕。CUDA内核内部的内存分配

这个问题说,我可以这样做一个内核中:CUDA allocate memory in __device__ function

这里有一个相关的问题:Efficiency of Malloc function in CUDA

是否有任何其他方法已经比在本文提出的一个解决了这个其他的我不知道? 在没有这种惩罚的情况下,在内核中不能malloc/free是很荒谬的。

+0

'tmp'来自您的伪代码? – talonmies 2012-03-21 14:24:18

+0

抱歉 - tmp = nComponents [0]; – 2012-03-21 14:25:36

+0

因此,每个内核调用都是不变的?如果是这样,为什么还要费神地分配内存分配? – talonmies 2012-03-21 15:02:58

回答

7

我想介绍malloc()会减慢代码的原因是它在全局内存中分配内存。当你使用一个固定大小的数组时,编译器很可能会把它放在寄存器文件中,这会更快。

必须在内核中执行malloc可能意味着您正尝试在单个内核上执行太多的工作。如果每个线程分配不同数量的内存,则每个线程在for循环中运行的次数会不同,并且会产生大量的翘曲差异。

如果一个warp中的每个线程运行的循环次数相同,则只需预先分配即可。即使它们运行次数不同,也可以使用恒定的大小。相反,我认为你应该考虑如何重构你的代码,从内核中完全移除这个循环。

+1

编译器不会将内核变量分配给共享内存,除非程序员使用'__shared__'限定符来定义它们。只有寄存器或本地内存。 – talonmies 2012-03-21 15:33:48

+0

@talonmies:谢谢你的澄清。我编辑了答案。 – 2012-03-21 15:50:15