2012-08-24 52 views
0

我有一個包含兩個主要任務的算法。這兩項任務都是令人尷尬的平行。所以我可以通過以下方式之一在CUDA上移植此算法。CUDA中的性能優化 - 我應該使用哪些算法?

>Kernel<<< 
Block,Threads>>>() \\\For task1 
cudaThreadSynchronize(); 
>Kerne2<<< 
Block,Threads>>>() \\\For task2 

或者我可以做以下事情。

>Kernel<<< 
Block,Threads>>>() 
{ 
    1.Threads work on task 1. 
    2.syncronizes across device. 
    3.Start for task 2. 
} 

人們可以注意到,在第一種方法,我們必須要回來CPU,而在第二個趨勢,我們將在CUDA使用跨所有塊同步。 IPDPS 10中的論文表示,第二種方法在適當的護理下可以表現得更好。但總的來說應該遵循哪種方法?

+3

嘗試一下,看看。 – GManNickG

+0

我得到的結果贊成第一種方法,有時贊成第二種方法。文獻中推薦什麼? –

+0

在這種情況下,確保第二種方法跟在紙上,看是否需要邊緣。如果兩者仍然相對相同(並且這是與您將要使用的真實數據),請保留您想要的數據。只是儘量保持切換它們的能力,所以你可以隨時測試。 – GManNickG

回答

2

目前還沒有任何官方支持的方法在CUDA編程模型中通過單個內核執行跨線程塊進行同步。根據我的經驗,這樣做的方法會導致代碼變得脆弱,導致在不斷變化的環境下發生不正確的行爲,例如在不同硬件上運行,更改驅動程序和CUDA發行版等。

僅僅因爲學術刊物發佈並不意味着它是生產代碼的安全想法。

我建議你堅持你的方法1,我問你這個問題:你確定把你的計算分成兩個單獨的內核真的會導致性能問題嗎?第二個內核的開銷肯定是瓶頸?

+0

「您是否確定將計算分離爲兩個單獨的內核實際上會導致性能問題?」 - 不完全是,但回到CPU的想法在我的應用程序中並不好,我想爲任務集啓動N個線程,並忘記從CPU端(這樣CPU線程可以做一些其他有用的工作)。所以我是想知道是否可以在設備上的所有線程上同步,但是如果同步的代價很高,那麼我必須使用「智能」的東西,以便在執行期間不要求我的應用程序來到CPU。 harrism: –

+0

:我已經閱讀了關於前綴總和的GPU寶石3中的章節,但我還沒有看到源代碼。在那個實現中你使用了上面哪個方法? –

+0

對於您的第一條評論,您可能會對即將推出的Kepler GK110 GPU中的CUDA Dynamic Parallelism感興趣 - 它使內核可以啓動其他內核(以及其他內核)。對於你的第二個評論:我總是使用方法1:在我看來,阻止同步的唯一安全方法是啓動另一個內核。 – harrism

相關問題