2011-05-24 11 views
1

私の並列プログラミングの本では、スレーブがデータセットを生成すると言うこのコードに遭遇しましたが、マスターがデータセットを誤って生成すると思います。並列処理 - スレーブはデータセットを生成しますか?

この行は、特に私がmasterがデータセットを生成すると考えている理由です。

for (i=0; i < ARRAY_SIZE; i++) 
     numbers[i] = i; 

マスターまたはスレーブがデータセットを生成するかどうか確認できますか?

#include "mpi.h" 
#include <stdio.h> 
#include <math.h> 
#include <stdlib.h> 

#define TRIALS 20 
#define ARRAY_SIZE 1000000 

int main(int argc, char *argv[]) 
{ 
    int myid, numprocs; 
    double startwtime, endwtime; 
    int namelen; 
    int* numbers = new int[ARRAY_SIZE]; 
    int i, j, sum, part_sum; 
    int s, s0, startIndex, endIndex; 
    double totalTime; 

    char processor_name[MPI_MAX_PROCESSOR_NAME]; 

    MPI_Init(&argc,&argv); 
    MPI_Comm_size(MPI_COMM_WORLD,&numprocs); 
    MPI_Comm_rank(MPI_COMM_WORLD,&myid); 
    MPI_Get_processor_name(processor_name,&namelen); 

    fprintf(stderr,"Process %d on %s\n", myid, processor_name); 
    fflush(stderr); 

    for (i=0; i < ARRAY_SIZE; i++) 
     numbers[i] = i; 

    if (myid == 0) 
    { 
     s = (int) floor(ARRAY_SIZE/numprocs); 
     s0 = s + ARRAY_SIZE%numprocs; 
     //printf("s=%d , s0= %d\n", s, s0); 
    } 

    MPI_Bcast(&s, 1, MPI_INT, 0, MPI_COMM_WORLD); 
    MPI_Bcast(&s0, 1, MPI_INT, 0, MPI_COMM_WORLD); 

    startIndex = s0 + (myid - 1)*s; 
    endIndex = startIndex + s; 

    totalTime = 0; 

    for (j = 1; j <= TRIALS; j++) 
    { 
     if (myid == 0) 
     { 
      startwtime = MPI_Wtime(); 
     } 

     sum = 0; 
     part_sum = 0; 

     if (myid == 0) // master 
     { 
      // compute sum of master's numbers 
      for (i = 0; i < s0; i++) 
      { 
       part_sum += numbers[i]; 
      } 
     } 
     else 
     { 
      for (i = startIndex; i < endIndex; i++) 
      { 
       part_sum += numbers[i]; 
      } 
     } 
     MPI_Reduce(&part_sum, &sum, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); 
     if (myid == 0) 
     { 
      double runTime; 
      endwtime = MPI_Wtime(); 
      runTime = endwtime - startwtime; 

      printf("Trial %d : Execution time (sec) = %f\n", j, runTime); 
      printf("Sum = %d \n", sum); 
      totalTime += runTime; 
     } 
    } // end for 
    if (myid == 0) 
     printf("Average time for %d trials = %f", TRIALS, totalTime/TRIALS); 

    MPI_Finalize(); 
} 

答えて

2

マスタースレーブの両方がアレイ全体を生成します。プログラムはすべてのノードで動作し、問題のコードの一部はマスター/スレーブを区別しないことを覚えておく必要があります。あなたの本の言葉は間違っているわけではありませんが、明らかにすることができます。 :)

+0

MPI_Initのためですか? – Raptrex

+0

本質的には、はい。 MPIプロセスは、 'MPI_Init'が正常に返された後にのみ開始され、引数リストのコピーを持つことが保証されます。 –