2014-11-04 47 views
-1

我跟着here的例子,並添加了一些測試代碼,但是當我添加新代碼時出現了一些奇怪的結果。結果如下所示。它掛在這裏,不能繼續下去。MPI_Bcast掛

[0]: Before Bcast, buf is 777 
[1]: Before Bcast, buf is 32767 
[0]: After Bcast, buf is 777 

這是從兩個角度奇怪:

  1. 它不會掛斷時的代碼是if(rank==i) if(i==0)

  2. 乳清buffer[1]不爲0 BCAST之前。

下面是代碼:

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

int main(int argc, char** argv) { 
    int rank; 
    int buf; 
    const int root=0; 

    MPI_Init(&argc, &argv); 
    MPI_Comm_rank(MPI_COMM_WORLD, &rank); 

    if(rank == root) { 
     buf = 777; 
    } 

    printf("[%d]: Before Bcast, buf is %d\n", rank, buf); 

    // newly added 
    for(int i=0; i<2; i++) 
    { 
     if(rank==i) 
     { 
      if(i==1) 
      MPI_Bcast(&buf, 1, MPI_INT, rank, MPI_COMM_WORLD); 
     } 
    } 
    // end newly added 

    /* everyone calls bcast, data is taken from root and ends up in everyone's buf */ 
    MPI_Bcast(&buf, 1, MPI_INT, root, MPI_COMM_WORLD); 
    printf("[%d]: After Bcast, buf is %d\n", rank, buf); 

    MPI_Finalize(); 
    return 0; 
} 

是我真正想要做的是實現以下功能: 每個處理器上運行的處理的某些部分,然後得到結果後,播放它,其他處理器通過組合接收結果更新他們自己的結果。

這裏是代碼的主要部分(原代碼爲LIBSVM)

struct decision_function 
{ 
    double *alpha; 
    double rho; 
}; 

int gate_no = 2; 
int p = 0; 

int nr_class = 8; 

for(int i=0;i<nr_class;i++) 
{ 
    for(int j=i+1;j<nr_class;j++) 
    { 
     if(((world_rank==i-2*gate_no*(i/(2*gate_no))) && (i%(2*gate_no) < gate_no))||((world_rank==2*gate_no*(i/(2*gate_no)+1)-i-1)&&(i%(2*gate_no) >= gate_no))) 
     { 
      // some process for generating f[p] here 
      .... 
      MPI_Bcast(f[p].alpha, count[i]+count[j], MPI_DOUBLE, world_rank, MPI_COMM_WORLD); 

     } 
     ++p; 
    } 
} 

但這代碼不起作用,我得到了一些錯誤。

Fatal error in PMPI_Bcast: Other MPI error, error stack: 
PMPI_Bcast(1478)......................: MPI_Bcast(buf=0xcc7b40, count=2340, MPI_DOUBLE, root=1, MPI_COMM_WORLD) failed 
MPIR_Bcast_impl(1321).................: 
MPIR_Bcast_intra(1119)................: 
MPIR_Bcast_scatter_ring_allgather(962): 
MPIR_Bcast_binomial(154)..............: message sizes do not match across processes in the collective 

回答

3

此塊

if(rank==i) 
    { 
     if(i==1) 
     MPI_Bcast(&buf, 1, MPI_INT, rank, MPI_COMM_WORLD); 
    } 

意味着只有過程1使呼叫MPI_Bcast。由於這是一個集體操作,所以傳播者的所有過程都應該調用它(同時)。在這種情況下,流程1正在等待所有其他流程,如果我理解正確的話,流程1將繼續,直到他們等待流程1的下一個對MPI_Bcast的呼叫。然後等待。等等。

我不確定你真的想做什麼,所以不能真正提供任何有關如何解決這個問題的建設性意見。

+0

非常感謝您的回覆。我再次編輯了這個問題。希望它更清楚。 – yuehust 2014-11-05 06:27:07

+0

我仔細閱讀您的意見。現在我終於明白了這個問題。這是因爲所有進程都需要調用'MPI_Bcast'。 [問題發佈](http://stackoverflow.com/questions/14511833/mpi-bcast-in-an-if-statement?rq=1)也幫助我很多。 – yuehust 2014-11-05 07:24:25

+0

運行商業代碼時出現類似錯誤。有沒有可以設置的標誌來延長完成MPI_Bcast所需的時間? – luksmir 2015-06-04 06:08:13