2017-11-11 15 views
0

私はMPI初心者です。私のプログラムは1から100までの合計を計算しますが、エラーを返すため、なぜ私は理解できません。 MPI_ReduceとMPI_Bcastを学習していますので、できる限り使用してみてください。 これは私のプログラムです。mpiでのMPI_ReduceとMPI_Bcastについての質問mpich

// 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を実行することを意味します。正しいですか?

2)thisによると、関数MPI_Reduce(const void * sendbuf、void * recvbuf、int count、MPI_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は各ランクの合計です。ランクごとに1つの整数が与えられます。

globalsumは、マスタプロセスで1つの整数を与えます。

#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; 
} 
関連する問題