2013-04-11 96 views
3

我有一組計算操作需要執行一個集羣(可能像512 MPI進程)。現在,我有集羣上的根節點打開套接字並在計算操作之間將數據傳輸到本地計算機,但是我想知道是否可以創建兩個MPI組,並且其中一個組是我的本地機器,另一個是遠程集羣,並使用MPI命令在它們之間發送數據。是否可以在本地計算機和遠程集羣上運行OpenMPI?

這可能嗎?

+1

我看不出有任何理由爲什麼不呢,除了實用的配置問題,具有NAT,代理服務器,安全,密碼短語,加密,防火牆,打開/關閉的端口等等......如果你是在同一個本地網絡(和真的一樣,就像你的機器和集羣之間只有交換機,沒有路由器),應該沒問題。您的下一個問題是配置mpi啓動系統和本地計算機上的節點,以便mpi啓動器識別。 (您需要在羣集的conf文件上進行root訪問)。但是,是的MPI是爲不同種類的公園製作的,所以... – 2013-04-11 03:09:22

回答

4

是的,只要羣集節點和您的機器之間存在網絡路徑,就有可能。 MPI標準提供了抽象機制來完成它,而Open MPI提供了一種非常簡單的方法來實現這些工作。您必須查看該標準(MPI-2.2的第10章)的過程創建和管理部分,並且具體涉及建立通信012.小節(MPI-2.2的第10.4節)。基本上這些步驟是:

  1. 您可以單獨啓動兩個MPI作業。這顯然是你做的,所以這裏沒有什麼新東西。
  2. 其中一項作業使用MPI_Open_port()創建網絡端口。此MPI調用將返回一個唯一的端口名稱,然後必須使用MPI_Publish_name()將其作爲公認的服務名稱發佈。一旦端口被打開,它就可以被用來通過調用阻塞例程MPI_Comm_accept()來接受客戶端連接。這項工作現在已成爲服務器工作。
  3. 其他MPI作業(稱爲客戶端作業)首先使用MPI_Lookup_name()從服務名稱中解析端口名稱。一旦擁有端口名稱,它就可以調用MPI_Comm_connect()以連接到遠程服務器。
  4. 一旦MPI_Comm_connect()與各自的MPI_Comm_accept()配對,兩個作業將建立它們之間的通信器,然後消息可以來回發送。

一個複雜的細節是客戶端作業如何查找給定服務名稱的端口名稱?這是Open MPI較少記錄的部分,但它很簡單:您必須提供用於啓動客戶端作業的mpiexec命令,其中服務器作業的mpiexec的URI用作某種目錄服務。要做到這一點,你應該用--report-uri -參數啓動服務器的工作,使其打印其URI到標準輸出:

$ mpiexec --report-uri - <other arguments like -np> ./server ... 

它會給你的形式1221656576.0;tcp://10.1.13.164:36351;tcp://192.168.221.41:36351長URI。現在你有這個URI與--ompi-server uri選項提供給客戶mpiexec

$ mpiexec --ompi-server 1221656576.0;tcp://10.1.13.164:36351... ./client ... 

注意,URI包含存在於節點的所有配置並啓用網絡接口的地址,其中服務器的mpiexec啓動。您應該確保客戶至少能夠訪問其中的一個。還要確保在啓用的BTL組件列表中有TCP BTL組件,否則不會有消息流動。TCP BTL通常默認啓用,但在某些InfiniBand安裝中,通過設置環境變量OMPI_MCA_btl的相應值或默認的Open MPI MCA配置文件,顯式禁用它。馬華參數可與--mca選項覆蓋,例如:

$ mpiexec --mca btl self,sm,openib,tcp --report-uri - ... 

也看到the answer,我給了一個類似的問題。

+0

很好的答案!謝謝! – Nick 2013-04-11 14:19:07

0

是的,如果存在可用的TCP/IP連接(MPI在隨機的高TCP端口 - 如果TCP用作傳輸層進行通信),它應該只是開箱即用。嘗試將您的機器添加到您提供給mpirun的hostfile。如果這不起作用,您可以使用MPI_Open_port直接連接到您的機器,這不需要mpirun

相關問題