2010-06-21 78 views
5

對不起模糊的話題問題,但我正在研究一些學術視頻處理例程。這些算法是用MATLAB編寫的,雖然對於開發目的來說很好,但是它以大約60spf或大約0.0166fps的速度處理視頻。不用說,這對於演示等是不夠的,所以我的暑期工作是將例程轉換爲快速運行的例程。什麼是一個令人尷尬的並行問題的最佳解決方案?

我已經重寫了CUDA代碼中最慢的部分,這是nvidia的GPGPU解決方案。但是,也有很大一部分代碼在CPU上看起來更好,因爲它是相對串行的。問題是,我給出的機器有2個Xeon處理器,總共8個邏輯內核,通過僅爲單核編碼來限制GPU代碼似乎是一種恥辱。視頻轉換過程的功能在於每個幀不依賴於其他幀,所以我在考慮某種異步隊列/流最好。

這裏是我的問題:什麼是最好的方式來實現這種類型的並行與最佳的比例努力來提高產量?

我看過的一些解決方案是OpenMP,.net TPL和簡單的pthreads。

我只是基本接觸異步編程,所以我寧願使用庫或其他東西,而不是亂搞互斥鎖和障礙,並多次在腳下自拍。我不介意學習,因爲這是我今年夏天的目標之一,但同時,並行是。但是,如果速度差異實際上非常明顯,我願意將頭髮拉出幾周。 :P

在此先感謝。

+0

如果你可以把問題分解成能上的工作沒有干擾(具有良好定義的同步點)的多個部分,然後使用應該只是糖「庫」 ......一個簡單的方法就是使用線程池,併發隊列(一個用於輸入,一個用於輸出),並且只訪問那個線程「擁有」的對象/數據(這可以放大到不可變的外部結構)。 – 2010-06-21 19:35:30

回答

3

如果最大化努力產出是你的目標,我會建議看看.NET中的TPL。這可能是實現這一點最簡單的方法。根據你的代碼的作用,你可以形成一個管道,或者甚至在每個「框架」上使用Parallel.For(或ForEach)。這就是說,如果你想堅持原生的非託管代碼,一個不錯的選擇可能是微軟的新Parallel Patterns LibraryIntel's Threading Building Blocks。它們都與新的TP​​L具有相似的結構,特別是對於數據並行性,並且只要「每個幀不依賴於其他幀」仍然如此,就可以很容易地進行並行化。

+0

打我吧!艾德·米勒曾在TechEd上提供與.NET 4.0的並行選項相談甚歡:http://www.msteched.com/2010/NorthAmerica/ARC205 – Mathias 2010-06-21 19:38:24

+0

PPL看起來就像是我一直在尋找,謝謝。 雖然有一個問題,使用像C#這樣的託管代碼顯然會減慢代碼,它主要是在大型數組上進行浮點運算?我喜歡簡化的編程環境,但是像視頻處理這樣的東西,我總是猶豫不決,因爲擔心垃圾收集和檢查開銷。 它可能只是舊的C編程偏執狂,但:\ – Xzhsh 2010-06-21 19:51:26

+0

Xzhsh:我個人使用C#和我的「日常工作」管理科學數據處理的代碼。它做得很好,但是表演完美。特性與本機代碼不同 - 所以你必須調整自己的想法來彌補。我個人不會擔心GC是一個問題,但是數組邊界檢查會降低你的速度(這可以被禁用)。然而,在大多數情況下,仔細的分析和「良好的」託管代碼可能會導致代碼與本地代碼一樣快(通常更快)。 – 2010-06-21 19:56:13

1

我的建議是以逐步的方式來解決這個問題。

  1. 首先,證明你有一個功能非MATLAB的實現。這不是微不足道的,坦率地說,我認爲在考慮表現之前,你應該計劃在100%的大腦循環中獲得正確性。

  2. 對您的解決方案進行分區:證明您可以將您認爲與實施的其餘部分分離的例程與其他代碼進行語法隔離。例如,如果您正在討論光線追蹤器,則可以將通過單個像素拍攝光線的單個視點產生的數學運算放入常見環境中。這也不是微不足道的,因爲它需要您考慮實際常見的內容(例如,環境的幾何圖形,紋理貼圖等)以及特定於特定情況的內容(例如,每個像素的光線) 。性能分析是你的朋友。

  3. 識別庫,或者你有興趣在該框架的語法將需要在並行創建線程/進程,啓動它們,完成後加入他們的結果。注意:您需要共享數據等方面互斥。例如,在Java世界中,這將是java.util.concurrency

  4. 嘗試生成兩個(只有兩個)線程半分割你的工作。編寫基準測試,可以測量您的初始解決方案,N = 2個線程的解決方案,並將結果分析出來。

  5. 只有這樣,你也別想進一步並行化。

如果按照這樣的步驟,你會(一)在您的實際任務(端口從MATLAB)成功,(B)有一些作品給一些已知的性能指標和(c)有明確的如果你想進一步利用並行化機會,你可以前進。

+0

感謝您的提示鮑勃! 我已經將例程移植到大多數C上,並行性只會在完全獨立的幀之間。 雖然我喜歡你的建議,並且一定會記住我的下一個項目 – Xzhsh 2010-06-21 19:48:11

+0

@Xzhsh,FYI,在我自己的圖形工作中,最好的並行性實際上是每幀,而不是將整個幀獨立分配給單個處理器。共享環境強烈激勵將像素分配到各個線程,並加速單個幀的計算(畢竟它是一個光線跟蹤器)。方法的選擇可能是您作爲項目一部分進行調查的另一個好主題。 – 2010-06-21 20:09:27

相關問題