2015-11-08 56 views
0

我開始使用MPI學習。我在MPI_Broadcast之後使用了MPI_Barrier,其中我向所有進程廣播了一個變量。但是,當我打印廣泛的流變變量時,它有一些來自內存的價值,但不是來自廣播。不知道我在做錯什麼。任何建議請。MPI - 在屏障後嘗試打印廣播變量,顯示其他變量

void main(int argc, char *argv[]){ 
    int x, comm_sz, my_rank; 

    MPI_Init(NULL,NULL); 
    MPI_Comm_size(MPI_COMM_WORLD, &comm_sz); 
    MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); 

    if(my_rank == 0){  
    x = strtol(argv[1], NULL, 10); 
    MPI_Bcast(&x, 1, MPI_INT, 0, MPI_COMM_WORLD); 
} 

MPI_Barrier(MPI_COMM_WORLD); 

if(my_rank != 0){ 
    printf("x is %d\n", x); 
} 

    MPI_Finalize(); 
} 

我只是想在值被廣泛應用於所有進程之後做一些操作。

+1

只動'MPI_Bcast()'你的'if' statment和都應該更好地工作,即使沒有障礙。 – Gilles

+1

感謝吉爾現在正在工作。 –

回答

2

錯誤在於此區域。

if(myRank == 0){  
    x = strtol(argv[1], NULL, 10); 
    MPI_Bcast(&x, 1, MPI_INT, 0, MPI_COMM_WORLD); 
} 

MPI_Barrier(MPI_COMM_WORLD); 

if(my_rank != 0){ 
    printf("x is %d\n", x); 
} 

MPI_Bcast應該由像這樣的所有方法來運行,因爲x的否則這些值將永遠不會在非根(秩== 0)的過程來填充。

if(myRank == 0){  
    x = strtol(argv[1], NULL, 10); 
} 

MPI_Bcast(&x, 1, MPI_INT, 0, MPI_COMM_WORLD); 

if(my_rank != 0){ 
    printf("x is %d\n", x); 
} 

由於MPI_Bcast阻塞,調用MPI_Barrier變成不必要的,因爲給定的工藝將不會繼續進行,直到所述處理已收到的X廣播的值。

See for more details

+1

謝謝克里斯。它的工作現在。瞭解到MPI_Bcast正在阻止.. –

+2

只是一句話:雖然MPI_Bcast()被阻塞,但它不會同步MPI進程。這種阻塞意味着在調用返回之後,使用通信緩衝區是安全的,因爲它不再需要,既不用於發送也不用於接收。但這並不意味着任何其他的通信過程已經開始或完成了調用......唯一存在的時間同步MPI調用是'MPI_Barrier()'。也就是說,這裏絕對不需要屏障,可以安全地移除。 – Gilles

+0

感謝吉爾斯,更新以反映這一點。 –