2010-03-30 33 views
9

要使用四核處理器的所有內核,我需要在代碼中更改哪些內容,是關於添加對多線程的支持還是由操作系統本身負責。我有FreeBSD,我使用的語言是C++。我想給我的應用程序提供完整的CPU週期至少90%。如何在應用程序中使用四核CPU

+9

被警告。線程是一件令人頭疼的事情,爲現有的應用程序增加線程支持更加糟糕。 – Yacoby 2010-03-30 13:20:23

+7

通常,使用4核CPU的最簡單方法是運行4個程序副本。如果由於數據結構的原因,這很不重要,所有建議的線程解決方案都很難。 – MSalters 2010-03-30 13:28:52

+1

您可以在沒有(程序員可見)共享狀態的情況下使用基於角色的併發來消除多線程編程所帶來的許多麻煩,但只有在您的架構能夠以這種方式建模時才能使用。 – 2010-03-30 14:01:18

回答

11

對於C++中的多線程應用程序,我建議Boost.Thread這應該可以幫助您充分利用四核機器的全部潛力。

至於改變你的代碼,你可能想考慮使事物儘可能不變。線程之間的狀態轉換更難以調試。有太多可能以意想不到的方式發生的事情。請參閱this SO線程。

3

我認爲你唯一的選擇是運行多個線程。如果你的應用程序是單線程的,那麼它將只運行在其中一個內核上(一次),但是如果你有更多的線程,它們可以同時運行。

+1

如上所述,另一種選擇是運行同一程序的多個副本。根據問題的性質,這可能會也可能不容易(請參閱http://en.wikipedia.org/wiki/Embarrassingly_parallel)。 – KeithB 2010-03-30 18:54:13

1

您需要通過使用Threading爲應用程序添加對並行性的支持。

一旦您支持並行性,則需要由操作系統將線程分配給CPU內核。

10

另一個在這裏沒有提到的選項是使用OpenMP,通過-fopenmplibgomp庫,這兩個庫都安裝在我的FreeBSD 8系統上。

這些給你#pragma指令並行化某些循環,而語句等,即你可以並行的位。它爲您處理線程和CPU關聯。請注意,這是一個通用的解決方案,因此可能不是最佳並行方式,但它可以讓您平行某些例程。

看看這個:https://computing.llnl.gov/tutorials/openMP/

至於使用線程/進程本身,某些程序和工作借給自己給它的方式。你能以這種方式分解任務嗎? fork()你的過程還是創建一個線程是否有意義?如果是這樣,那麼,如果不是這樣,不要試圖強制你的應用程序是多線程的,因爲。我通常給出的一個例子是最大公約數算法 - 它依賴於傳統實現中所有時間之前的步驟,因此很難並行化。

另請注意,衆所周知,對於某些算法來說,並行處理實際上對於並行處理的小值很慢,因爲雖然作業更快完成,但分叉和連接的相關時間成本(是線程或進程)實際上將時間推到串行實現的時間之上。

19

need某種形式的並行性。多線程或多處理將會很好。

一般,多線程容易處理(因爲他們可以訪問共享數據)不是多個過程。但是,通常,多個線程都是來處理(因爲他們訪問共享數據)比多個進程。 而且,是的,我故意寫了這個。

如果你有一個SIMD場景,看看OpenMP的Ninefingers' suggestion也很不錯。 (如果您不知道SIMD的含義,請參閱下面的Ninefingers的有用評論。)

+0

是自相矛盾的故意嗎?我同意,fork()和線程都有優點/缺點。 – 2010-03-30 13:30:04

+1

我這麼認爲。 +1。 – 2010-03-30 13:33:17

+4

+1爲自我矛盾:-) – Sebastian 2010-03-30 14:14:18

0

我認爲您應該關注的第一件事是您的應用程序及其算法是否適合在parellel中執行(或者可能作爲一組可以獨立處理的串行任務)。如果情況並非如此,那麼很難多線程化或將其分解爲並行進程,並且您可能需要考慮修改其工作方式。

確定可以從並行處理中受益後,您可以選擇使用多個進程或線程。這個選擇很大程度上取決於應用程序的性質以及並行進程的獨立性。因爲它們處於相同的過程中,所以在線程之間協調和共享數據更容易,但開發和調試的難度也更大。

如果您決定關閉多線程路由,Boost.Thread是一個很好的庫。

2

我想給我的應用程序提供完整的CPU週期至少90%。

爲什麼?你的芯片不夠熱?

嚴重的是,它需要世界各地的專家數十名,如果沒有了數百個小時並行負載均衡的應用程序,以便它使用90%的所有4個內核。 您的CPU已經支付,無論您是否使用它,其成本都是相同的。 (實際上,如果你不使用它,它的運行成本會稍微低一點,從電子方面講,)你的時間值多少錢?您願意投資多少小時才能更有效地使用可能花費300美元的資源,並且可能大部分時間都處於閒置狀態?

有可能通過並行獲得的速度提升,但它的在人類的時間昂貴。你需要一個很好的理由來證明這一點。 (學習如何是一個足夠好的理由。)

我對並行編程知道的所有優秀書籍都是針對C++以外的語言,並且有很好的理由。如果你想在並行性方面感興趣的東西檢查出隱式並行程序min在pH並行編程在MLFortress Project

+0

沒有人閱讀這個答案會驚訝我的答案「你如何利用多核」http://stackoverflow.com/questions/363341/how-are-you-taking-advantage-of-multicore :-) – 2010-03-31 01:15:41

相關問題