2012-03-21 132 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