2011-07-25 20 views
2

我在研究是否有框架/庫可以幫助我實現分佈式計算系統。分佈式計算的C/C++框架(MPI?)

我有了大量分裂成幾百兆的文件數據的所有者。這些文件將被分成大約1MB並分發給工作人員進行處理。一旦初始化,每個工作人員的處理都依賴於從前一個組塊獲得的狀態信息,因此工作人員必須在整個過程中保持活躍狀態​​,並且主人需要能夠將正確的組塊發送給正確的工作人員。另外需要注意的是,這個系統只是一個更大的處理鏈。

我做的尋找到MPI(具體開放MPI)一點點,但我不知道這是否是合適人選。它似乎適用於發送小消息(幾個字節),儘管我確實發現了一些圖表顯示吞吐量隨着更大的文件(高達1/5 MB)而增加。

我擔心可能沒有保持狀態,除非它是在消息不斷來回發送的方式。看一些MPI的例子,它看起來像是主人(等級0),工人(等級1-n)是同一部分的一部分,他們的行爲是由條件決定的。我可以讓工人保持活力(維持狀態)並等待更多消息到達嗎?

現在我正在寫這個,我認爲它會工作。等級1 ... n部分只是一個帶有阻塞接收的循環,後面跟着處理代碼。該狀態將保持在該循環中,直到收到「沒有更多數據」消息,在該點上它將發回結果。我可能會開始掌握這裏的MPI結構...

我對MPI的另一個問題是如何實際運行代碼。請記住,該系統是更大系統的一部分,因此需要從其他代碼調用。我見過的例子使用了mpirun,通過它可以指定處理器數量或主機文件的數量。通過從其他代碼中調用我的MPI函數可以獲得相同的行爲嗎?

所以我的問題是MPI在這裏的正確框架?有什麼更適合這項任務,或者我會從頭開始做這件事嗎?

+0

你用C或C++? – Puppy

回答

2

MPI對於您的任務似乎是合理的選擇。它使用SPMD體系結構,這意味着您可以在可能分佈的甚至異構的系統上同時執行相同的程序。因此,0級作爲主人而其他人作爲工人的過程的選擇不是強制性的,您可以選擇其他模式。

如果你想爲你的應用提供了狀態,你可以使用一個不斷的生活MPI應用程序和主進程發送到工人的人命令,隨着時間的推移。您可能還應該考慮將該狀態保存到磁盤,以便爲失敗提供更強大的可靠性。

運行MPI過程最初由mpirun完成。例如,您創建一些程序program.c,然後使用mpicc -o program program.c進行編譯。然後你必須運行mpirun -np 20 ./program <params>來運行20個進程。你將擁有20個獨立的進程,每個進程都有自己的等級,所以你的應用程序會有進一步的進展這20個進程將在節點/處理器之間分配的方式受hostfile等的控制,應該更仔細地查看文檔。

如果你想你的代碼重用,即可以運行從另一個MPI程序,您通常至少應該學習什麼MPI通信,以及如何創建/使用一個。網上有文章,關鍵詞是「創建MPI庫」。

如果使用你的庫的代碼不是在MPI本身,它沒有什麼大問題,你的MPI程序不限於MPI的通信。它應該通過MPI在它的邏輯內進行通信。您可以使用mpirun調用任何程序,除非它嘗試調用MPI庫,它不會注意到它正在MPI下運行。

0

看看FastFlow。他們使用數據流模型來處理數據。如果這個模型適合你,它是非常有效的。

2

如果你正在起步並運行一個集羣和mpi,那麼我建議看一下boost mpi。它是一個基礎mpi庫(如openmpi或mpich2)的C++封裝器。我發現它非常有用。

您的想法是先發送郵件,每個節點在完成之前請求一條新郵件,直到提供「不再發送郵件」的握手爲止。我有一個類似的想法,並得到了一個簡單的版本,並運行。我只是把它放在github上,以防你想看看。 https://github.com/thshorrock/mpi_manager。大部分代碼位於頭文件中: https://github.com/thshorrock/mpi_manager/blob/master/include/mpi_manager/mpi_manager.hpp

請注意,這只是一些代碼,用於啓動並運行,未完全記錄,並且不是最終版本,但其相當短,爲我的目的正常工作,應該爲您提供一個起點。