3

私は最近MPIで働いています。私はまだMPIに非常に慣れていません。しかし最近、MPICH2 を使用しているときに問題が見つかりました。これは、Hello world プログラムを変更した私の小さな Fortran 90 プログラムです。私はそれのcバージョンをテストしていませんが、それらは非常に似ているはずです(関数名とエラーパラメータが異なります)。

私は Windows 7 64 ビット、MinGW (gcc バージョン 4.6.2、および 32 ビット コンパイラ) で作業しており、MPICH2 1.4.1-p1 32 ビット バージョンを使用しています。簡単なコードをコンパイルするために使用したコマンドは次のとおりです。

gfortran hello1.f90 -g -o hello.exe -IC:\MPICH2_x86\include -LC:\MPICH2_x86\lib -lfmpich2g

そして、ここに簡単なコードがあります:

  program main
  include 'mpif.h'
  character * (MPI_MAX_PROCESSOR_NAME) processor_name
  integer myid, numprocs, namelen, rc,ierr
  integer, allocatable :: mat1(:, :, :)

  call MPI_INIT( ierr )
  call MPI_COMM_RANK( MPI_COMM_WORLD, myid, ierr )
  call MPI_COMM_SIZE( MPI_COMM_WORLD, numprocs, ierr )
  call MPI_GET_PROCESSOR_NAME(processor_name, namelen, ierr)

  allocate(mat1(-36:36, -36:36, -36:36))
  mat1(:,:,:) = 0
  call MPI_Bcast( mat1(-36, -36, -36), 389017, MPI_INT, 0, MPI_COMM_WORLD, ierr )
  call MPI_Allreduce(MPI_IN_PLACE, mat1(-36, -36, -36), 389017, MPI_INTEGER, MPI_BOR, MPI_COMM_WORLD, ierr)
  print *,"MPI_Allreduce done!!!"
  print *,"Hello World! Process ", myid, " of ", numprocs, " on ", processor_name
  call MPI_FINALIZE(rc)
  end

コンパイルできますが、実行時に失敗しました (無効なメモリ アクセスでしょうか?)。その行を削除すると正常に動作するため、MPI_Allreduce に問題があるはずです。また、マトリックスを小さくしても機能します。同じバージョンのMPIを備えたubuntuマシンでも試しました。Linux では問題ありません。

gdb(MinGWに付属)を使用してチェックする場合(gdb hello.exe、次にバックトレース)。私は意味のないものを手に入れました(または自分のためのようです):

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 16316.0x4fd0]
0x01c03100 in mpich2nemesis!PMPI_Wtime ()
   from C:\Windows\system32\mpich2nemesis.dll
(gdb) backtrace
#0  0x01c03100 in mpich2nemesis!PMPI_Wtime ()
   from C:\Windows\system32\mpich2nemesis.dll
#1  0x0017be00 in ?? ()
#2  0x00000000 in ?? ()

これは、Windows 版の MPI ライブラリに何か問題があるということですか? それを機能させるための解決策は何ですか?

ありがとう。

4

1 に答える 1

4

これは問題を解決しないかもしれませんがMPI_INT、fortran-mpi データ型ではありません。 MPI_INTEGER対応するデータ型です。Fortran 側ではさまざまな実装が提供される可能性がありますMPI_INTが、これは標準で定義されていないことは確かです。でコードをコンパイルしてみて、エラーが発生するかどうかを確認しIMPLICIT NONEてください ( if もテストしてくださいMPI_INTEGER .ne. MPI_INT)。問題が発生した場合はMPI_INT、コンパイラによって何らかの値が割り当てられていることが原因です (または、MPI のバージョンがMPI_INT他のデータ型に使用されています...)。これは、MPI によって設定された定義済みの値の 1 つと競合する可能性があります。したがって、整数の配列を他の型として扱っているため、バッファ オーバーフローが発生し、あらゆる種類の面白い方法で現れる可能性があります。

于 2012-09-05T11:25:09.913 に答える