2015-08-28 21 views
0

我編寫了一個用於模擬通信系統的代碼。在這個通信系統中,有一部分是我使用pthreads並行運行的。它基本上糾正了由通道引起的錯誤。如何提高使用障礙的C++ pthread代碼的時間性能

當我收到一個比特幀時,算法的3個組件在比特上運行。通常情況下,它們會一個接一個地運行,這會產生最佳性能,但會造成巨大的延遲。

這個想法是讓它們並行運行。但爲了獲得最佳性能,這3個組件同時處理每一點。

如果我只是平行運行它們,我會得到不好的結果,但性能相當快。所以我使用障礙來同步進程,每個比特在被三個組件處理之前允許它們跳到下一個比特。

此方法的性能是最佳的。但代碼運行速度非常慢,我比串行執行速度更慢。

該代碼在Ubuntu上運行GCC編譯器。

編輯:還有一個問題,線程去睡覺,而他們正在等待屏障打開?如果是的話,我如何阻止他們這樣做?

+0

輸入緩衝區只能讀取所有線程,並且每個線程都應該有自己的輸出緩衝區。這樣你就不需要任何鎖,並且可以並行處理。 – SHR

+0

這是一個很好的解決方案,但是,組件相互依賴,它們本質上是遞歸的。 – user304584

+0

你如何產生線程?你在使用某種線程池嗎? – SHR

回答

2

如果你確實需要在每個之後進行同步,那麼很簡單的線程並不是一個合適的方法。同步開銷將遠遠超過計算成本,所以你最好在單線程中完成。

你可以將作品分成更高層次嗎?例如,整個幀由單個線程處理,但是有多個幀並行處理?

+0

它不一定是一點一點地同步。這給了我一個想法,即只在區塊長度的25%,50%和75%處放置屏障。 感謝您的回答。我想說明的是,我已經在實際模擬中並行處理塊,但在分析結果時將其關閉。 – user304584

+0

呵呵,所以關鍵是不要讓一個線程在其他線程前面太遠(或者一個線程太落後)。 – caf

1

這是一個可能的解決方案,使用沒有MUTEX。假設你有4個線程:主線程讀取一些輸入,其他3個線程按塊處理它的塊。一個線程可以在前一個完成處理之後處理一個塊。

讓你有一個塊的數據類型:

class chunk{ 
byte buffer[CHUNK_SIZE]; 
char status; // use char for atomic input, c++11 can use std::atomic_int. 
public: 
chunk():status(0); 
}; 

,你有塊列表:上塊運行

std::list<chunk> chunks; 

所有線程,直到他們達到列表的末尾,但等待狀態達到條件,當輸入塊完成時,主線程將狀態設置爲1。第一個線程等待狀態爲1,意味着輸入已完成,完成時狀態設置爲2,線程2等待狀態爲2意味着線程1已完成,完成處理該塊後,將狀態設置爲3,依此類推。最後,主線程等待狀態爲4以獲得結果

設置狀態時重要,使用=而不是++使其儘可能原子化。