【问题标题】:MPI_Allreduce failed in MPICH2MPI_Allreduce 在 MPICH2 中失败
【发布时间】:2012-08-28 14:04:14
【问题描述】:

我最近与 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 库有问题? 让它发挥作用的解决方案是什么?

谢谢。

【问题讨论】:

  • 那个 389017 ,mpi_bcast 的 int count 部分对我来说看起来不正确
  • 也可以测试 mpi 库是否正常工作,为什么不找一个不错的 mpi hello world 示例,看看是否编译
  • @pyCthon 你可能是对的,我用 openmpi 得到了更直接的错误消息:[20989] *** MPI_Bcast [20989] 中发生错误 *** 在通信器 MPI_COMM_WORLD [20989] *** MPI_ERR_TYPE:无效数据类型 [20989] *** MPI_ERRORS_ARE_FATAL(再见)
  • 这对我来说实际上工作得很好,因为我有机会运行代码,我用 mpif90 gcc45 4.5.4_1 进行了测试,所以这绝对是一个与 Windows 相关的错误
  • 感谢 pyCthon。正如我所说,代码在 Linux 机器上工作,但如果你使用 MinGW + MPICH2 1.4.1p1 会失败。我从 MPICH2 官方网站下载了 MPI。我会在他们的邮件列表中问这个问题,看看他们是否有答案。

标签: fortran mingw mpi mpich


【解决方案1】:

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

【讨论】:

  • 非常感谢 mgilson。虽然它不能解决 MPI_Allreduce 问题,但它是一个好点! MPI_INTEGER 和 MPI_INT 是不同的。它们具有不同的值(1275069467 和 1275069445)。但即使我添加了隐式无,也没有关于它的错误消息。你说的对。我应该使用 MPI_INTEGER 而不是 MPI_INT。
猜你喜欢
  • 2014-05-31
  • 2019-07-01
  • 2012-03-10
  • 2011-07-26
  • 1970-01-01
  • 2015-07-24
  • 2014-12-04
  • 2020-06-25
  • 2012-10-10
相关资源
最近更新 更多