MPICH2中的MPI_Allreduce失败

时间:2012-09-03 22:10:22

标签: fortran mingw mpi mpich

我最近在与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库出现了问题? 什么是使其有效的解决方案?

感谢。

1 个答案:

答案 0 :(得分:3)

这可能无法解决您的问题,但MPI_INT不是fortran-mpi数据类型。 MPI_INTEGER是相应的数据类型。不同的实现可以在fortran方面提供MPI_INT,但我很确定这不是由标准定义的。尝试使用IMPLICIT NONE编译代码,看看它是否有抱怨(同时测试MPI_INTEGER .ne. MPI_INT)。如果它抱怨,发生的事情是MPI_INT被编译器分配了一些值(或者你的MPI版本使用MPI_INT来获取其他一些数据类型......)。这可能与MPI设置的预定义值之一冲突。因此,它将整数数组视为一些其他类型,可能导致缓冲区溢出,这可能会以各种有趣的方式表现出来。