1

C で OpenMPI を使用してループから抜け出す方法を理解するのに苦労しています。

これが私のループです

 for( i=1; i<=steps;i++) {

    do_calculation(psi,new_psi,&mydiff,i1,i2,j1,j2);

    if (breakNow == 1) {
       break;
    }

     diff = find_difference();
    if(myid == mpi_master && i % iout == 0){
       printf("%8d %15.5f\n",i,diff);


       if (diff == 0.00) {
        printf("DONE!");

        breakNow = 1;

         MPI_Bcast(&breakNow, 1, MPI_INT, mpi_master, MPI_COMM_WORLD);
       }          
    }
  }

差が 0.00 の場合、すべてのプロセッサをループから外す必要がありますが、breakNow 変数がすべてのプロセッサにブロードキャストされていないようです。何か不足していますか?

4

1 に答える 1

0

MPI_Bcast集団運営です。完了するには、すべてのプロセスで呼び出す必要があります。ランクが一致するプロセスでmpi_rootは、ブロードキャストは送信操作のように動作し、他のすべてのランクでは受信操作として動作します。

呼び出しをMPI_Bcast条件の外に移動するだけです。ちょうど良い場所は、列の直前かもしれませんif (breakNow == 1) break;

別の提案:find_differenceすべてのプロセスで同じ値を返す場合は、次のようなことができます。

for (i = 1; i <= steps; i++) {

   do_calculation(psi, new_psi, &mydiff, i1, i2, j1, j2);

   diff = find_difference();
   if (i % iout == 0) {
      if (myid == mpi_master) {
          printf("%8d %15.5f\n", i, diff);
          if (diff == 0.00)
             printf("DONE!");
      }
      if (diff == 0.00) break;
   }
}

マスター プロセスでのみ意味のある結果が得られる場合find_differenceは、次のように変更します。

for (i = 1; i <= steps; i++) {

   do_calculation(psi, new_psi, &mydiff, i1, i2, j1, j2);

   diff = find_difference();
   if (i % iout == 0) {
      if (myid == mpi_master) {
          printf("%8d %15.5f\n", i, diff);
          if (diff == 0.00)
             printf("DONE!");
      }
      MPI_Bcast(&diff, 1, MPI_DOUBLE, mpi_master, MPI_COMM_WORLD);
      if (diff == 0.00) break;
   }
}

diff(私はそれがタイプであると仮定し、コードの元のセマンティクスを保持して、ステップdoubleごとにゼロの違いをチェックしました)iout

于 2012-10-17T19:43:55.500 に答える