2012-05-05 141 views
2

我正在C/MPI建立一個分佈式Web服務器,似乎點對點通信完全停止後,我的代碼中的第一個MPI_BARRIER工作。標準C代碼在屏障後工作,所以我知道每個線程都通過屏障。在屏障之前,點對點通信也可以正常工作。但是,當我在屏障之前複製粘貼與屏蔽線相同的代碼時,它會完全停止工作。 SEND將永遠等待。當我嘗試使用ISEND代替它時,它通過線路,但從未接收到該消息。我一直在使用googling這個問題很多,每個有MPI_BARRIER問題的人都被告知這個屏障能夠正常工作,並且他們的代碼是錯誤的,但是我不知道爲什麼我的代碼是錯誤的。什麼可能導致這種行爲?MPI_SEND停止工作後MPI_BARRIER

下面是一個說明這是一個示例程序:

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

int main(int argc, char *argv[]) 
{ 
    int procID; 
    int val; 
    MPI_Status status; 

    MPI_Init(&argc, &argv); 
    MPI_Comm_rank(MPI_COMM_WORLD, &procID); 
    MPI_Barrier(MPI_COMM_WORLD); 

    if (procID == 0) 
    { 
    val = 4; 
    printf("Before send\n"); 
    MPI_Send(&val, 1, MPI_INT, 1, 4, MPI_COMM_WORLD); 
    printf("after send\n"); 
    } 

    if (procID == 1) 
    { 
    val = 1; 
    printf("before: val = %d\n", val); 
    MPI_Recv(&val, 1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status); 
    printf("after: val = %d\n", val); 
    } 

    MPI_Finalize(); 
    return 0; 
} 

移動兩個if語句障礙導致該程序正常運行之前。

編輯 - 看起來第一次通信,無論類型,工作原理以及所有將來的通信都失敗。起初我認爲這更一般。第一次溝通是障礙還是其他一些信息並不重要,沒有任何未來的溝通可以正常工作。

+0

您發佈的代碼對我來說看起來很好。你使用的是什麼版本的MPI? – suszterpatt

+0

隨着openmpi 1.5.5適合我。 – chemeng

+0

我知道這是openmpi,但我似乎無法弄清楚什麼版本號。有沒有告訴你的命令? – TEOUltimus

回答

5

Open MPI在使用TCP/IP進行通信時具有一個已知功能:它嘗試使用所有配置的網絡接口處於「UP」狀態。如果某些其他節點無法通過所有這些接口訪問,則這會成爲問題。這是Open MPI採用的貪婪通信優化的一部分,有時候,就像您的情況一樣,會導致問題。

看來,至少所述第二節點具有已啓動且多於一個接口,這一事實被在協商階段期間引入到第一個節點:與128.2.100.167

  • 配置

    • 一個一個用192.168.109.1配置(你有在機器上運行的隧道或Xen的?)

    阻擋通信發生在所述第一網絡上,然後在下一個MPI_Send試圖發送到所述第二地址OV呃明顯不連接所有節點的第二個網絡。

    最簡單的解決方案是告訴Open MPI只能使用連接節點的nework。你可以告訴它這樣做使用下面的MCA參數:

    --mca btl_tcp_if_include 128.2.100.0/24 
    

    (或任何你的通信網絡)

    您還可以指定網絡接口的列表,如果它在所有機器上是相同的,例如

    --mca btl_tcp_if_include eth0 
    

    ,或者你可以告訴開放MPI特別排除某些接口(但你必須告訴它排除了回送「LO」如果你這樣做):

    --mca btl_tcp_if_exclude lo,virt0 
    

    希望幫助你許多其他人在這裏似乎都有相同的問題。看起來,最近幾乎所有的Linux發行版都默認啓動了各種網絡接口,這很可能會導致Open MPI出現問題。

    P.S.請將這些節點放在防火牆後面!

  • +0

    謝謝!您建議的第二個修復程序(指定網絡接口)運行得非常好。 此外,我正在運行這個集羣是在我學校的防火牆後面。我很確定他們知道他們在做什麼。 :d – TEOUltimus