2013-02-06 86 views
0

我想知道是否可以編寫持久性GPU功能。我有我的疑惑,但我不確定調度程序是如何工作的。持久GPU功能/操作

我正在尋找處理未知數量的數據點(約5000萬)。數據以20塊左右的大塊形式出現。如果我可以將這20個點放入一個GPU「桶」中,並且讓這個「持續」操作在進入時進行處理,那將是一件好事。完成後,抓取結果。
當bucket爲空時,我可以讓GPU保持忙碌狀態。但我認爲部分空的水桶上的競賽條件將成爲一個問題。
我懷疑當這個持久操作正在運行時,我不能在GPU上運行任何其他操作。即讓其他未經專門治療的SM工作。

這是一種可行的(費米)GPU方法,還是一個壞主意?

+0

你想做什麼有點含糊不清;當你說「過程」時,這個處理是否獨立於新到的數據?另外,你的時間要求是什麼?是什麼阻止你收集所有點並一次處理它們?在目前的形式中,我認爲這不會構成對GPU的良好使用,一次運行20個元素對於CPU來說通常會更好(儘管這又取決於你想要做什麼) – alrikai

+0

所有5000萬個數據點彼此獨立。他們都經歷了相同的過程。它們都有助於獲得單一結果。在一個塊中發送全部5000萬個點不會導致加速。 Xfering採用20點的塊可以減少CPU的開銷。 – Doug

+0

所以你可以獨立執行這個操作,但是你會得到一個標量結果?當您累積數據並將運行的部分結果存儲在全局內存中時,是否有任何東西阻止您執行多個內核調用?而我試圖通過20個元素來運行的一點是,它可以更有效地累積更大的東西(例如幾千個元素)並將它們一次發送到GPU。但不知道你的程序的具體細節,我不能提出具體的建議。 – alrikai

回答

1

我不確定這個持久內核是否可行,但肯定會效率很低。雖然這個想法是優雅的,但它不適合GPU:您必須全局通信哪個線程從桶中選擇哪個元素,一些線程可能永遠不會開始,因爲他們等待其他元素完成並且桶必須是聲明爲volatile,因此會減慢整個輸入數據。

更常見的問題解決方案是將數據分成塊並異步地將塊複製到GPU上。您將使用兩個流,一個處理最後發送的塊,另一個處理從主機發送一個新塊。這實際上將同時完成。這樣你可能會隱藏大部分轉移。但是不要讓塊變得太小,否則你的內核會受到低佔用率的影響,性能會下降。