gpt4 book ai didi

fortran - MPICH2 中的 MPI_Allreduce 失败

转载 作者:行者123 更新时间:2023-12-02 18:10:15 25 4
gpt4 key购买 nike

我最近在 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 then backtrace)。我得到了一些毫无意义的东西(或者似乎是为了我自己):

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

谢谢。

最佳答案

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

关于fortran - MPICH2 中的 MPI_Allreduce 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12254558/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com