2010-03-22 75 views
3

嘗試運行boost::mpi tutorial中的第一個示例時,我無法在兩臺以上的計算機上運行。具體而言,這似乎運行正常:無法在兩臺以上的計算機上運行OpenMPI

mpirun -hostfile hostnames -np 4 boost1 

與主機名的每個主機名<node_name> slots=2 max_slots=2。但是,當我將進程數量增加到5時,它就會掛起。當我超過2臺機器時,我已將slots/max_slots的數目減少爲1,結果相同。在節點上,這表明了在任務列表:

<user> Ss orted --daemonize -mca ess env -mca orte_ess_jobid 388497408 \ 
-mca orte_ess_vpid 2 -mca orte_ess_num_procs 3 -hnp-uri \ 
388497408.0;tcp://<node_ip>:48823 

另外,如果我殺了它,我得到這個消息:

node2- daemon did not report back when launched 
node3- daemon did not report back when launched 

的集羣建立與mpiboost庫訪問在NFS掛載的驅動器上。我是否遇到NFS的僵局?或者,其他事情還在繼續?

更新:要清楚,我正在升壓程序

#include <boost/mpi/environment.hpp> 
#include <boost/mpi/communicator.hpp> 
#include <iostream> 
namespace mpi = boost::mpi; 

int main(int argc, char* argv[]) 
{ 
    mpi::environment env(argc, argv); 
    mpi::communicator world; 
    std::cout << "I am process " << world.rank() << " of " << world.size() 
     << "." << std::endl; 
    return 0; 
} 

從@Dirk Eddelbuettel的recommendations,我編譯並運行MPI例如hello_c.c,如下

#include <stdio.h> 
#include "mpi.h" 

int main(int argc, char* argv[]) 
{ 
    int rank, size; 

    MPI_Init(&argc, &argv); 
    MPI_Comm_rank(MPI_COMM_WORLD, &rank); 
    MPI_Comm_size(MPI_COMM_WORLD, &size); 
    printf("Hello, world, I am %d of %d\n", rank, size); 
    MPI_Barrier(MPI_COMM_WORLD); 
    MPI_Finalize(); 

    return 0; 
} 

它在具有多個進程的單臺機器上運行良好,包括進入任何節點並運行。每個計算節點與通過NFS從遠程計算機安裝的工作目錄和mpi/boost目錄完全相同。當從文件服務器運行boost程序時(與boost/mpi以外的節點相同)是本地的),我可以在兩個遠程節點上運行。對於「世界你好」,但是,運行命令mpirun -H node1,node2 -np 12 ./hello我得到

[<node name>][[2771,1],<process #>] \ 
[btl_tcp_endpoint.c:638:mca_btl_tcp_endpoint_complete_connect] \ 
connect() to <node-ip> failed: No route to host (113) 

,而所有的「Hello World的」打印和它掛在末尾。但是,從遠程節點上的計算節點運行時的行爲不同。

從節點2運行時,「Hello world」和升壓代碼都掛起mpirun -H node1 -np 12 ./hello,反之亦然。 (掛起的意思與上面相同:ort正在遠程計算機上運行,​​但未通信回傳。)

事實上,該行爲與mpi庫在本地和計算節點上運行的文件服務器上的運行不同,這表明我可能會遇到NFS死鎖。這是一個合理的結論嗎?假設情況如此,我如何配置mpi來允許我靜態鏈接它?此外,我不知道如何從文件服務器運行時得到的錯誤,有什麼想法?

回答

5

答案結果很簡單:打開mpi通過ssh進行身份驗證,然後打開節點之間的tcp/ip套接字。計算節點上的防火牆設置爲只接受彼此的ssh連接,而不是任意連接。所以,在更新iptables之後,hello world就像所有節點中的冠軍一樣運行。

編輯:應該指出,文件服務器的防火牆允許任意連接,所以這就是爲什麼運行mpi程序的行爲不同於在計算節點上運行的原因。

2

我的第一個建議是簡化:

  • 你可以建立標準MPI「你好,世界」的例子嗎?
  • 你可以在localhost上多次運行它嗎?
  • 你可以在另一臺主機上通過ssh
  • 的路徑是相同

如果是這樣執行的話

mpirun -H host1,host2,host3 -n 12 ./helloworld 

宜遊跨越。一旦將這些基礎知識整理出來,請嘗試Boost教程...並確保在您計劃運行的所有主機上都有Boost和MPI庫。

+0

@Dirk:感謝您的建議。我已經用這些觀察結果更新了我的問題。 – rcollyer 2010-03-23 14:35:48

2

考慮使用參數--mca btl_tcp_if_include eth0使節點只使用eth0接口並阻止OpenMPI找出哪個網絡是最好的。還有--mca btl_tcp_if_exclude eth0請記住代替eth0爲您的特定界面。

我的/ etc/hosts中包含這樣的詩句:

10.1.2.13 node13

...

10.1.3.13 node13-IB

當我推出的mpirun的TCP網絡被選中並且節點使用TCP網絡,但是在一段時間(20秒)之後,OpenMPI發現了IP 10.1.3.XXX並試圖使用它們,這導致了錯誤消息。

我希望它能幫助

相關問題