2012-05-23 29 views

回答

1

我想,你有比賽條件問題。您可以重新組織代碼並在需要的地方添加同步。在調試模式下,你的線程通常按順序執行,你不能得到這個問題。

+2

「在調試模式下,你的線程通常按某種順序執行,你不能得到這個問題」。你能指出哪裏有記錄嗎? – talonmies

+0

@talonmies CUDA調試沒有很好地記錄。這是我們的猜測。我認爲這是因爲生成了許多額外的調試代碼。你有沒有任何相反的信息? – geek

+0

我這樣做,而且我相信硬件執行或調度模型以某種方式根據編譯器的變化而變化是專利廢話。構建調試的任務是消除一些優化,並將共享內存和寄存器泄漏到本地內存,以便主機可以在執行期間檢查其狀態。根據體系結構的不同,這可以通過移除某些硬件內存保護以及使用不同的指令(以及JIT優化)在塊本地內存上運行來顯着改變行爲。 – talonmies

2

使用-O0生成的代碼會導致不太理想的代碼以及顯着更多的全局和本地內存訪問,這些訪問可能會隱藏競爭條件。如果您認爲共享內存中可能存在爭用條件,則可嘗試使用新的CUDA 5.0預覽內存檢查程序,該檢查程序支持某些形式的競態條件檢測。您最好的選擇是查找您在兩個線程之間共享內存的任何位置,並確定是否缺少同步線程的線程範圍。

相關問題