2010-03-30 98 views
9

我需要用C++編寫一個科學應用程序,其中執行大量計算並使用大量內存。我有一部分工作,但由於資源方面的高要求,我正在考慮開始轉向OpenMPI用於集羣和HPC的C++編程

在做這件事之前,我有一個簡單的好奇心:如果我正確理解OpenMPI的原理,開發人員可以根據當時可用的節點調用SEND和RECEIVE,在不同節點上分割作業。

你知道它是否確實存在一些庫或操作系統或任何有這種能力讓我的代碼保持原樣嗎?基本上,連接所有電腦的東西,讓共享作爲他們的內存和CPU?

我有點困惑,因爲這個主題上有大量可用的材料。 我應該看看雲計算嗎?或分佈式共享內存?

回答

5

目前沒有C++庫或實用程序可以讓您自動將代碼跨機器羣並行化。當然,有很多方法可以用其他方法實現分佈式計算,您真的想要優化應用程序以使用消息傳遞或分佈式共享內存。

你最好的賭注將是:

  1. 將您的實現爲基於任務的解決方案。有很多方法可以做到這一點,但這絕對是手工完成的。
  2. 清楚地確定你可以在哪裏打破任務,以及這些任務如何實質上相互溝通。
  3. 使用建立在OpenMPI/Mpich上的更高級別的庫 - Boost.MPI浮現在腦海。

實現並行分佈式解決方案是一回事,使其高效工作是另一回事。閱讀不同的拓撲結構和不同的並行計算模式,使實施解決方案比不必從頭開始的痛苦少一些。

+0

嗨!非常感謝您的回覆。 – 2010-03-31 15:39:54

2

如果消息傳遞阻止了你,嘗試分佈式對象。有很多可用的分佈式對象框架。 CORBA,DCOM,ICE等等......如果您選擇分發對象,您的對象將通過您將定義的接口(數據和方法)具有全局可見性。任何節點中的任何對象均可訪問這些分佈式對象。

我一直在尋找軟件,允許分配內存,但沒有遇到任何。我猜是因爲你有所有這些分佈式對象框架可用,而且人們也不需要像這樣分配內存。

+0

太棒了!我聽到很多關於我的一些老朋友使用的這些技術..我會問,並開始看看! – 2010-03-31 15:41:43

2

我在研究生院使用Top-C有很好的經驗。

來自主頁:「TOP-C特別將它自己區分爲可輕鬆並行現有順序應用程序的軟件包。」

http://www.ccs.neu.edu/home/gene/topc.html

編輯:我要補充,這是更簡單,如果用「微不足道並行」並行的程序。例如節點不需要需要共享內存。 Mapreduce建立在這個概念之上。如果您可以最大限度地減少節點使用的共享狀態數量,則可以從並行處理中看到更好的數量級改進。

+0

嗨!非常感謝您的回覆。我不知道這個項目!我會有一個loook! – 2010-03-31 15:40:59

4

那麼,你實際上並沒有確切地說明你的目標硬件是什麼,如果它是共享內存的機器,那麼OpenMP是一個選項。大多數並行程序員認爲使用OpenMP進行並行化比使用MPI的任何形式更容易。我還建議,將OpenMP改裝爲現有代碼比MPI更容易。從表現最好的角度來看,最好的MPI程序是從頭開始設計並與消息傳遞並行的程序。

此外,最佳順序算法可能並不總是最有效的算法,一旦它被平行化。有時候,一個簡單但順序次優的算法是更好的選擇。

您可以訪問到共享內存的計算機:

  • 所有多核CPU的有效共享內存的計算機;
  • 在許多集羣上,節點通常是兩個或四個強的CPU,如果它們每個都有4個內核,那麼您的集羣上可能有一個16核共享內存計算機;
  • 如果您有權訪問MPP超級計算機,您可能會發現其每個節點都是共享內存計算機。

如果你被卡住消息傳遞,那麼我強烈建議你堅持使用C++和的openmpi(或任何MPI已經安裝在系統上),你應該在BoostMPI無疑顯得太。我強烈建議這樣做,因爲一旦你走出高性能科學計算的主流,你可能會發現自己身處一場編程之中,擁有一套特殊的適合研究型圖書館和其他工具。 C++,OpenMPI和Boost已經被很好的使用,你可以把它們視爲'武器級'或者你喜歡的類比。例如,在MPI和OpenMP上流量很少,在您投注農場之前查看其他技術的統計數據。

如果您對MPI沒有經驗,那麼您可能需要查看一本名爲並行科學計算的書,C++和MPI由Karniadakis和Kirby編寫。 Gropp使用MPI可以作爲參考,但它並不是初學者關於消息傳遞編程的文本。