2009-10-21 190 views
1

我有一些CUDA代碼,nvcc(好吧,技術上ptxas)喜歡花費10分鐘以上的時間進行編譯。雖然它不小,但它並不是很大。 (約5000行)。CUDA:nvcc需要幾分鐘才能編譯的原因是什麼?

延遲似乎來和CUDA版本更新之間走了,但以前只用了一分鐘左右,而不是10

當我用-v選項,似乎顯示以下後卡住:

ptxas --key="09ae2a85bb2d44b6" -arch=sm_13 "/tmp/tmpxft_00002ab1_00000000-2_trip3dgpu_kernel.ptx" -o "/tmp/tmpxft_00002ab1_00000000-9_trip3dgpu_kernel.sm_13.cubin" 

內核確實有相當大的參數列表,並具有良好的多個指針被傳來傳去的結構,但我知道,有在至少一個時間點,這非常接近完全相同的代碼僅在幾秒鐘內編譯完成。

我正在運行64位Ubuntu 9.04,如果有幫助。

任何想法?

+0

也許是一個錯誤的編譯器?編譯器是否使用了大量內存並導致系統崩潰? – 2009-10-21 22:07:08

+0

鑑於問題的本質,我不會感到驚訝。尤其是當我用--device-emulation編譯時,它會很快編譯。當然,即使它是編譯器中的一個bug,我仍然希望能夠做些什麼。 – rck 2009-10-23 18:14:36

+0

如果您禁用優化,會發生什麼情況? – 2009-10-26 14:53:45

回答

0

您應該注意,可以傳遞給函數的參數列表的大小有限制,當前爲256字節(請參見CUDA編程指南的B.1.4部分)。功能是否完全改變?

還有每核心200萬個PTX指令的限制,但;-)

什麼工具包的版本,您使用的是你不應該接近?如果您是註冊開發者,這是一項重大更新,則可以使用3.0測試版。如果您仍有問題,請聯繫NVIDIA,他們需要能夠重現該問題。

+0

我知道參數限制,我遇到過這個問題。 (令人煩惱的是,我似乎無法通過使用結構來解決它)。然而,我不清楚這是否是放緩的一個因素。 – rck 2009-11-25 17:20:11

2

我有類似的問題 - 沒有優化,編譯失敗用完寄存器,並與優化,它花了近半個小時。我的內核有這樣的表達式

t1itern[II(i,j)] = (1.0 - overr) * t1itero[II(i,j)] + overr * (rhs[IJ(i-1,j-1)].rhs1 - abiter[IJ(i-1,j-1)].as * t1itern[II(i,j - 1)] - abiter[IJ(i-1,j-1)].ase * t1itero[II(i + 1,j - 1)] - abiter[IJ(i-1,j-1)].ae * t1itern[II(i + 1,j)] - abiter[IJ(i-1,j-1)].ane * t1itero[II(i + 1,j + 1)] - abiter[IJ(i-1,j-1)].an * t1itern[II(i,j + 1)] - abiter[IJ(i-1,j-1)].anw * t1itero[II(i - 1,j + 1)] - abiter[IJ(i-1,j-1)].aw * t1itern[II(i - 1,j)] - abiter[IJ(i-1,j-1)].asw * t1itero[II(i - 1,j - 1)] - rhs[IJ(i-1,j-1)].aads * t2itern[II(i,j - 1)] - rhs[IJ(i-1,j-1)].aadn * t2itern[II(i,j + 1)] - rhs[IJ(i-1,j-1)].aade * t2itern[II(i + 1,j)] - rhs[IJ(i-1,j-1)].aadw * t2itern[II(i - 1,j)] - rhs[IJ(i-1,j-1)].aadc * t2itero[II(i,j)])/abiter[IJ(i-1,j-1)].ac; 

,當我改寫了他們:

tt1 = lrhs.rhs1; 
tt1 = tt1 - labiter.as * t1itern[II(1,j - 1)]; 
tt1 = tt1 - labiter.ase * t1itern[II(2,j - 1)]; 
tt1 = tt1 - labiter.ae * t1itern[II(2,j)]; 
//etc 

它顯著降低編譯時間和註冊使用。

+0

有趣。當你重寫它們時,它是否仍然沒有優化而失敗?也就是說,你是否將它重寫爲只有優化器能夠保存寄存器的提示,還是基本編譯器能夠做到的呢? – rck 2009-11-25 17:14:21

+0

它甚至沒有優化。看起來像nvcc有基本的編譯器麻煩,而優化器問題只是結果 – 2009-11-25 17:27:32

0

在編譯行設置-maxrregcount 64幫助,因爲它會導致寄存器分配溢出到LMEM較早

相關問題