2015-12-17 56 views
0

我試圖在一臺計算機上輸入一個數字,然後將它廣播到使用MPI的所有其他計算機上。MPI_Bcasts掛在slave上

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

int main (int argc, char** argv) 
{ 

int myid, numprocs, processor_name_length; 
char processor_name[MPI_MAX_PROCESSOR_NAME]; 

MPI_Init (0, 0); 
MPI_Comm_rank (MPI_COMM_WORLD, &myid); 
MPI_Comm_size (MPI_COMM_WORLD, &numprocs); 
MPI_Get_processor_name (processor_name, &processor_name_length); 

int number = 0; 
if (myid == 0) { 
    printf ("Input number: "); 
    scanf ("%d", &number); 
} 

MPI_Bcast(&number, 1, MPI_INT, 0, MPI_COMM_WORLD); 
printf ("Hello from process %d of %d. Number: %d [%s]\n", myid, numprocs, number, processor_name); 

MPI_Finalize(); 
return 0; 

} 

當我編譯並運行它:

mpicc -o bcast bcast.c 
mpiexec -hosts umaster,uslavea -n 2 ./bcast 

這promts我要上位機上輸入,那麼它後,我輸入的號碼將打印的printf此消息,然後將其掛..

輸出:

Input number: 10 
Hello from process 0 of 2. Number: 10 [umaster] 

應該有消息:

Hello from process 1 of 2. Number: 10 [uslavea] 

編輯:

如果我用這個命令運行:

mpiexec -hosts master -n 4 ./bcast 

一切正常,我也有,我用MPI_Send(...)和我得到拒絕連接錯誤另一個例子,但是,如果我跑在單機上的例子一切正常。我假設我的配置/集羣不好。下面的例子能正常工作:

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

int main (int argc, char** argv) 
{ 
    int myid, numprocs; 

    MPI_Init (0, 0); 
    MPI_Comm_rank (MPI_COMM_WORLD, &myid); 
    MPI_Comm_size (MPI_COMM_WORLD, &numprocs); 
    printf ("Hello from process %d of %d.\n", myid, numprocs); 
    MPI_Finalize(); 
    return 0; 
} 

與運行它:

mpiexec -hosts master,uslavea,uslaveb,uslavec -n 4 ./hello 

我已經創建了4個虛擬機,生成的DSA密鑰,我可以從每一個到每一個使用ssh登錄時不要求密碼。 (來自主人:例如ssh mpiuser @ uslavea)。在所有機器上,用戶都是mpiuser,每臺機器的密碼都相同。

可能是什麼問題?我重複運行只有與主人-n X工作正常。

+0

我不確定,所以這只是一條評論。我認爲奴隸掛在'MPI_Get_processor_name(...)',可能是因爲'processor_name_length'從未設置。 – Soana

+0

我已經刪除了,同樣的事情發生......如果我刪除'''MPI_Bcast(...)'''然後程序退出罰款,否則它掛起。 – clzola

+0

它看起來非常好,應該工作。也許機器不能看到對方/不能溝通?其他溝通方法的工作? – Soana

回答

2

我想通了。問題是我使用服務器的名稱而不是IP地址。運行它

mpiexec -hosts 192.168.100.100,192.168.100.101,192.168.100.102,192.168.100.103 -n 4 ./bcast 

解決了這個問題。

+0

你應該儘可能設置你的IP地址別名爲主機名。這對你現在會有所幫助,當然這會在以後更容易讓開發人員變得更加輕鬆。 – NoseKnowsAll

+0

我的/ etc/hosts文件看起來像這樣 '''192.168.100.100主192.168.100.101 uslavea 192.168.100.102 uslaveb 192.168.100.103 uslavec''' 每個新行 – clzola

+0

是在'/ etc/hosts'這些條目在所有節點上? –