1

この単純な関数を開発して、mpiと並列環境でn個の合計を実行し、各プロセッサがその部分的な合計を計算し、ペアごとに異なるプロセッサが計算された量を通信して、バイナリツリーを作成する戦略を使用しました。もちろん、この戦略は、プロセッサの数が2^nの倍数である場合に適用できます。

パラメータ:menum = idプロセッサ、nproc =プロセッサの総数、sum=部分合計

  void Second_Strategy( int menum ,int nproc,int sum, MPI_Status status)
  {
    int a,b,p,i,sumtmp;
    double t_tot, t1, t2, diff;

    p=log(nproc)/log(2);
    t1 = MPI_Wtime();

    for(i=1;i<=p;i++)
    {
       b=pow(2,i-1);
       a=pow(2,i);
       if ( (menum % a) ==0) 
       {
          MPI_Recv(&sumtmp,1,MPI_INT,(menum+b),i,MPI_COMM_WORLD,&status);
          sum=sum+sumtmp;

        }else{
               if ( ( menum % b) ==0){MPI_Send(&sum,1,MPI_INT,(menum-b),i,MPI_COMM_WORLD); }

            }
      }
        t2 = MPI_Wtime();
        diff = t2-t1;
        MPI_Reduce(&diff, &t_tot, 1, MPI_DOUBLE, MPI_MAX, 0, MPI_COMM_WORLD);

        if(menum==0) 
        {

          printf("The sum is : %d \n ",sum);
          printf("Time  : %f seconds\n", t_tot);

        }      

 }

この場合、プロセスP0は合計の結果になります。しかし、ユーザーがパラメータ「choice」を導入する合計を持つプロセッサを選択する場合。実行する方法?プロセス間でデータを交換するためのバイナリツリーの作成に問題があります。

4

1 に答える 1

2

最も簡単な解決策は、ユーザーが選択したプロセスがランク 0 を受け取る新しいコミュニケーターを作成することです。次にMPI_COMM_WORLD、ツリー構築アルゴリズムの代わりにそのコミュニケーターを使用するだけです。

もちろん、これは、数値を合計する目的ではなく、並列通信の演習のために行っていると想定しています。合計は で簡単に取得できるためMPI_Reduce()です。

于 2012-10-29T19:06:51.187 に答える