2017-10-11 7 views
0

これは私のコードで素数を数えたものです。しかし、MPI_RecvとMPI_Isendではなく、 'MPI_Scatter'と 'MPI_Gather'を使ってコードを変更したときにエラーが発生しました。私はそれのために何を変えるべきですか?Parellelプログラミング: 'MPI_Isend'と 'MPI_Recv'の代わりに 'MPI_Gather'または 'MPI_Scatter'を適用するには

これは私の元のコードです:

MPI_Request req; 
MPI_Status status; 
MPI_Init(&argc,&argv); 
MPI_Comm_size(MPI_COMM_WORLD, &p); 
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); 

if(my_rank == 0){ 
    printf("Input(50-1000) : "); 
    fflush(stdout); 
    scanf("%d",&w); 
    for(i=0; i<w; i++) data[i] = i+1; 
} 

MPI_Bcast(&w, 1, MPI_INT,0,MPI_COMM_WORLD); 
MPI_Bcast(data, w, MPI_INT,0,MPI_COMM_WORLD); 

if(my_rank != 0){ 
    x = w/(p-1); 
    low = (my_rank-1)*x; 
    high = low+x-1; 
    for(num = data[low]; num <= data[high];num++){ 
     result = 0; 
     t=1; 
     while(num>=t){ 
       if(num%t==0) 
       result = result +1; 
      t += 1; 
     } 
     if(result==2) i += 1; 
    } 
    MPI_Isend(&i,1,MPI_INT,0,0,MPI_COMM_WORLD,&req); 
} 

if(my_rank == 0){ 
    int j = 0; 
    for(j = 1; j < p; j++){ 
     MPI_Recv(&i,1,MPI_DOUBLE,MPI_ANY_SOURCE,0,MPI_COMM_WORLD,&status); 
    printf("Process %d : There are %d prime numbers\n",status.MPI_SOURCE,i); 
    } 
} 
MPI_Finalize(); 

}

されて出力される。ここで

Input(50-1000) : 50 
Process 1 : There are 5 prime numbers 
Process 2 : There are 4 prime numbers 
Process 3 : There are 2 prime numbers 
Process 4 : There are 4 prime numbers 

は、私は自分のコードを変更する部分である:

if(my_rank != 0){ 
     x = w/(p-1); 
     low = (my_rank-1)*x; 
     high = low+x-1; 
     for(num = data_send[low]; num <= data[high];num++){ 
      result = 0; 
      t=1; 
      while(num>=t){ 
       if(num%t==0) 
        result = result +1; 
        t += 1; 
       } 
      if(result==2) i += 1; 
    } 
MPI_Scatter(data_send,1,MPI_INT,data_recv,1,MPI_INT,0,MPI_COMM_WORLD); 
    } 
+0

p MPIタスクを使用するためには、このアルゴを手配することができます注意してくださいget – cowbert

+0

「Input(50-1000):」入力の質問のみが表示されますが、結果は提供されずにプログラムが実行されているようです。 – Lumby

+0

あなたは 'MPI_INT'を送信しますが、' MPI_DOUBLE'を受け取ります。 'MPI_Isend()'によって返されたリクエストを決して 'MPI_Wait()'しないでください。 –

答えて

1

あなたはMPI_Gather()

int * results; 
if(my_rank != 0){ 
    x = w/(p-1); 
    low = (my_rank-1)*x; 
    high = low+x-1; 
    for(num = data[low]; num <= data[high];num++){ 
     result = 0; 
     t=1; 
     while(num>=t){ 
       if(num%t==0) 
       result = result +1; 
      t += 1; 
     } 
     if(result==2) i += 1; 
    } 
} else { 
    results = (int *)malloc(p * sizeof(int)); 
} 

MPI_Gather(&i, 1, MPI_INT, results, 1, MPI_INT, 0, MPI_COMM_WORLD); 

if(my_rank == 0){ 
    int j = 0; 
    for(j = 1; j < p; j++){ 
     printf("Process %d : There are %d prime numbers\n",j, results[j]); 
    } 
    free(results); 
} 

を使用する方法であるあなたにもランク0の計算を行い、ひいては代わりにあなたをやったエラーp-1

+0

ああ私はそれを持っています!どうもありがとうございました :) – Lumby

1

MPI_Scatterは集合的な操作であり、すべてのランクで呼び出す必要があります。同じことがMPI_Gatherになります。

意味:MPI_Scatterコールはコード内のifブロックの外に移動する必要があります(MPI_Gatherと同様)。

hereがあります。ここ

+0

また、 'MPI_Send()'/'MPI_Recv()'バージョンに基づいて、 'MPI_Scatter()'の代わりに 'MPI_Gather '。 –

+0

btwなら、ランク0で何らかの計算をすることを検討するかもしれません。そうしないと、 'MPI_Gather()'が完了するのを待っているリソースが無駄になります。 –

+0

もっと正確に説明できますか? ifブロックの外にMPI_Gather関数を置くと、すべてのデータが消えてしまいました...すべてのプロセスは0で、すべての素数も元の入力値です – Lumby

関連する問題