2017-11-11 241 views
0

我是MPI的新手。我的程序計算從1到100的總和,但拋出一個錯誤,我不明白爲什麼。 我正在學習MPI_Reduce和MPI_Bcast,所以我儘量使用它們。 這是我的程序。詢問MPI_Reduce和MPI_Bcast的mppi

// include something 


int main (int argc, char * argv[]) 
{ 
    int rank, size, root = 0; 
    int i,j,k,S[100],n=100,p, sum; 

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

    //get n 
    if(rank==root){ 
     n=100; 
    } 
    //send data to all process 
    MPI_Bcast(&n, n, MPI_INT,root, MPI_COMM_WORLD); 

    p=n/rank; 
    while(p>0){ 
     for(i=1;i<p;i++){ 
      for(k=0;k<rank;k++){ 
       S[k]=i+i*rank; 
      } 
     } 
     p=p/2; 
    } 
    //get data from all process 
    MPI_Reduce(S, &sum, n, MPI_INT, MPI_SUM, root, MPI_COMM_WORLD); 

    if(rank==root){ 
     printf("Gia tri cua S trong root: %d", sum); 
    } 

    MPI_Finalize(); 
    return 0; 
} 

這是我的錯誤:

job aborted: 
[ranks] message 

[0] process exited without calling finalize 

[1-4] terminated 

---- error analysis ----- 

[0] on DESKTOP-GFD7NIE 
mpi.exe ended prematurely and may have crashed. exit code 0xc0000094 

---- error analysis ----- 

我也有一些不太清楚MPI,我希望你能幫助我弄清楚:
1)如果我有這樣的代碼:

//include something 
int main(){ 
    MPI_Init(&argc, &argv); 
    int rank, size, root = 0; 
    MPI_Comm_rank(MPI_COMM_WORLD, &rank); 
    MPI_Comm_size(MPI_COMM_WORLD, &size); 
    //code 1 
    if(rank==0){ 
    //code 2 
    } 
} 

這意味着每個進程將執行代碼1,只有等級0將執行代碼2。它是正確的嗎?根據this,函數MPI_Reduce(const void * sendbuf,void * recvbuf,int count,MPI_Datatype datatype,MPI_Op op,int root,MPI_Comm comm)具有recvbuf。但我不清楚它是否會從sendbuf或其他東西接收數據?

感謝您的幫助。

+2

的可能的複製[MPI \ _Reduce不能按預期(https://stackoverflow.com/questions/13666002/mpi-reduce-doesnt-work-as-expected) – Zulan

回答

0

我修改了你的程序來計算從0到9(這是45)的總和。 使用mpiC++編譯它,並在開始時使用2個進程運行它,在評論中使用「cout」以更好地瞭解哪個排名正在做什麼。

localsum是每個等級的總和,它給每個等級一個整數。

globalsum在主進程中給出一個整數。

#include <iostream> 
using namespace std; 

int main (int argc, char * argv[]) 
{ 
int rank, size, root = 0; 
int j,k,S[10],n=10,p; 

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

//get n 
if(!rank){ 
    n=10; 
} 
//send data to all process 
MPI_Bcast(&n, n, MPI_INT,root, MPI_COMM_WORLD); 

int localsum = 0, globalsum = 0 ; 
for (int i = rank; i < n; i += size) { 
    S[i] = i; 
    localsum += S[i]; 
    // cout << rank << " " << S[i] << endl; 
} 

// cout << localsum << endl; 

//get data from all process 
MPI_Reduce(&localsum, &globalsum, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); 

if(!rank){ 
    cout << "Globalsum: " << globalsum << endl; 
} 

MPI_Finalize(); 
return 0; 
}