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