2012-07-19 70 views
2

我正在寫一個代碼,它必須執行一個塊間同步(N維和其他內存傳輸操作的總和)。當我增加問題的維度時,結果是錯誤的。cuda線程

我做synchornization與_ threadfence()和第一維度(N < 192),這是確定的,但如果我在一段代碼插入其他 _threadfence(),結果是正確的爲更多維度。

一個threadfence()不足以同步?有意義的是,數據結果在同一個塊中使用。

在節目指南的信息表明,threadfence等待所有的存儲空間已經準備好(共享和全球)

+0

歡迎堆棧溢出。我認爲你的問題中沒有足夠的信息讓某人能夠給予很好的答覆。你有沒有在CUDA C編程指南中檢查'__threadfence()'的部分以查看它是否按照你期望的方式工作? – 2012-07-20 00:36:44

+0

請爲您的問題提供示例代碼。 – harrism 2012-09-19 00:31:02

回答

7

還有就是塊之間的同步沒有很好的方式。你可以採用哈希方式來等待自旋並消耗GPU的內存帶寬,或者你可以終止你的內核並開始一個新的內核。

__threadfence()而不是用於塊之間的同步。 __threadfence()用於暫停當前線程,直到所有以前對共享和全局內存的寫入都可以被其他線程看到。它不會停止也不會影響其他線程的位置!

您可以檢查這些問題:

+0

感謝您的回答。但在我的問題中,只有一個塊進程會生成一個全局結果,它在這個地方不理解函數threadfence。如果結果僅僅受到一個區塊的影響,那麼等待結果是不必要的。這種方法的原因是產生了最好的性能,因爲調用內核是迭代的,應該分配內存。 – MariaDavila 2012-07-20 20:08:26

+0

@ CygnusX1:假設內核執行中的所有線程正在對全局內存執行一些寫操作,並且我們不想繼續進行,直到所有線程的所有寫操作都可見。寫入後所有線程都不會調用__threadfence()來確保同步? – 2013-05-14 21:05:05

+1

編號'__threadfence()'只保證*當前*線程不會繼續,直到當前線程對全局內存的所有先前更改都可以被其他線程看到。然而,其他線程可能會嘗試在發生之前從相同的存儲單元中讀取數據,讀取舊數據並繼續執行超過'__threadfence()'。 – CygnusX1 2013-05-14 22:08:34