2015-09-04 20 views
7

我在實驗室工作,編寫多線程計算程序,在C++ 11上使用std::thread。現在我有機會在多CPU服務器上運行我的程序。如何利用C++中的多CPU?

服務器:

  • 運行Ubuntu的服務器
  • 有40個英特爾CPU的

我一無所知多CPU的編程。第一個想法,我想到運行40個應用程序,然後將他們的結果粘合在一起。這是可能的,但我想更多地瞭解我的機會。

  1. 如果我通過它的gcc編譯器在服務器上編譯我的代碼,那麼結果應用程序會利用多CPU嗎?
  2. 如果#1答案取決於,我該如何檢查它?

謝謝!

+1

如果您的程序已經有多個線程,那麼操作系統會自動在不同的CPU上安排這些線程。你將受到線程數量的限制。如果您創建10個線程,那麼您的程序將被限制爲最多10個CPU。 –

+1

如果每個「結果」完全獨立於其他所有其他應用程序,我實際上會編寫一個單獨的線程應用程序,然後通過'parallel'執行它(請參閱'sudo apt-get install parallel; man parallel') – v010dya

+0

要求非現場資源不在SO上。我已經刪除了關於圖書館和其他資源的子問題,因爲問題的其餘部分是可回收的。 – Puppy

回答

0

你的問題不僅是關於多線程,而是關於多CPU。

  1. 基本上操作系統會自動將線程分散到核上。你不需要做任何事情。

  2. 一旦您使用C++ 11,您可以調用std::thread::get_id(),並確定不同的線程,但無法識別您正在使用的核心。直接使用pthreads +「cpu親和力」。

你可以谷歌的「CPU親和力」獲得更多關於如何控制它的細節。如果你想要這種精度。您可以識別核心以及選擇核心...您可以從此開始:http://man7.org/linux/man-pages/man3/pthread_setaffinity_np.3.html

+3

這個答案似乎與這個問題無關。提問者對核心或線程關聯沒有明顯的需求,這基本上是你所討論的。 – Puppy

+0

啊,小狗打敗了我。 OP在詢問如何多線程,而不是如何將線程綁定到內核。在大多數面向吞吐量的應用程序中,您不關心線程在哪裏運行。 – Mysticial

+0

他不僅詢問多線程,而且詢問多CPU。這是一個不同的小球......他想檢查它。這意味着他需要一個較低級別的代碼來檢查多CPU。 –

5

如果您的程序運行多線程,則操作系統應自動處理它使用可用的CPU。

確保將您必須做的工作分配給大約相同數量的線程,您可以使用CPU。確保它不僅僅是一個工作線程,其他線程只是等待這個線程的終止。