QA@IT

[OpenMPI] MPI_REDUCEの演算子が定義されていない旨のエラー

4517 PV

いつもお世話になっております。

 bewulf型のPCクラスタ(OS CentOS release 6.4)を構築して、OpenMPIの勉強をしています。
MPI_REDUCEを用いた下記の様なfortran90のコードを実行したところ、「MPI_SUM is not defined on the MPI_INTEGER」という
エラーが出てしまいます。

 クラスタの構成は、headノード(bwhead)とslaveノード(bwslv01,02)が2ノードでホームディレクトリを共有して、MPI等ライブラリは、各ノードに同じ物をインストールしております。

 また、headノードのみで実行した場合は、想定した結果が帰ってきて、それぞれのスレーブノードで単機実行した場合に同様のエラーになります。なぜこのようなエラーが出るのでしょうか? ご教授のほどよろしくお願いいたします。

エラーメッセージ

[bwslv01:30793] *** An error occurred in MPI_Reduce: the reduction operation MPI_SUM is not defined on the MPI_INTEGER datatype
[bwslv01:30793] *** on communicator MPI_COMM_WORLD
[bwslv01:30793] *** MPI_ERR_OP: invalid reduce operation
[bwslv01:30793] *** MPI_ERRORS_ARE_FATAL: your MPI job will now abort
--------------------------------------------------------------------------
mpirun has exited due to process rank 1 with PID 30793 on
node bwslv01 exiting improperly. There are two reasons this could occur:

1. this process did not call "init" before exiting, but others in
the job did. This can cause a job to hang indefinitely while it waits
for all processes to call "init". By rule, if one process calls "init",
then ALL processes must call "init" prior to termination.

2. this process called "init", but exited without calling "finalize".
By rule, all processes that call "init" MUST call "finalize" prior to
exiting or it will be considered an "abnormal termination"

This may have caused other processes in the application to be
terminated by signals sent by mpirun (as reported here).
--------------------------------------------------------------------------
[bwhead.clnet:02147] 1 more process has sent help message help-mpi-errors.txt / mpi_errors_are_fatal
[bwhead.clnet:02147] Set MCA parameter "orte_base_help_aggregate" to 0 to see all help / error messages

fortran90のコード

      include 'mpif.h'
      parameter(nmax=12)
      integer n(nmax)

      call mpi_init(ierr)
      call mpi_comm_size(MPI_COMM_WORLD, isize, ierr)
      call mpi_comm_rank(MPI_COMM_WORLD, irank, ierr)
      ista=irank*(nmax/isize) + 1
      iend=ista+(nmax/isize-1)
      isum=0
      do i=1,nmax
        n(i) = i
        isum = isum + n(i)
      end do
      call mpi_reduce(isum, itmp, 1, MPI_INTEGER, MPI_SUM,
     & 0, MPI_COMM_WORLD, ierr)

      if (irank == 0) then
        isum=itmp
        WRITE(*,*) isum
      endif
      call mpi_finalize(ierr)
      end

回答

どちらもあまり詳しくないのですが、

  • 型宣言してないものが多いように思いますが平気ですか?
    itmp, isumなどが宣言されていないような(Fortranだと暗黙の型になりますよね?)。

  • MPI_SUMの指定可能な型にFortran INTEGERは含まれている様にも思いますが、ほかの型(REAL)などにした場合もエラーは起こりますか?

http://www.open-mpi.org/doc/v1.4/man3/MPI_Reduce.3.php

Fortran integer: MPI_INTEGER
MPI_SUM, MPI_PROD C integer, Fortran integer,
floating-point, complex

※ REALはたぶんfloatingpointとして定義されていてサポートされてると思います。というかOPEN_MPIのMPI_SUMのサンプルコードでよく見かけます。

  • こちらの OpenMPIのサンプルの様にmpi_type_create_f90_integer を使った場合はどうなるでしょうか?

http://www.open-mpi.org/community/lists/users/att-20829/mpi_sum.f90

編集 履歴 (0)
  • 回答有り難うございます。
    宣言が無いのは、Fortranの場合暗黙の型宣言があるので問題ないと思います。

    お示しのサンプルを試しましたら、エラーが出ず実行できました。
    当方の症状で解せないのは、headノードで問題なくてslaveノードで問題がある点です。
    -
  • そこはノードがいなくてreduceが発生しなかったのかなぁとなんの根拠もなく思ってたんですが、そんなわけはないんですかね? -
  • reduceが発生しないというのが感覚的に分かりません。ノードは、確かにあります。よくある自分のランクを表示するサンプルは、正常に実行できましたから。 -
  • MPIの仕様にのっとってない私のただの感覚ですので軽く流してください。SIZEとった段階でnprocは1なわけで誰とも合算する必要がないことをヘッド(マスタ?)は知っているわけですからそんな最適化が起こってるのかなって思った次第です。 -
  • 一方でスレーブだけの場合でも自分がマスタではないような実行状況なら自分の計算分はマスタに返さなくてはならなくて合計処理が走って落ちるのかなぁという感じです。ヘッドとスレーブと明示されていたのでヘッドは不変なのかな?と思ったせいもあります。前述の通り特に根拠はないです。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。