MPI_Init()需要很长时间才能运行

时间:2013-10-04 16:03:44

标签: windows-8 cygwin fortran mpi fortran90

我有一个问题的最小例子,我只是启动4个进程(在具有8个线程的四核Intel Core i7 cpu上)并且由于某种原因MPI_Init似乎需要非常长的时间

这是我的代码:

 1 program smear_sfs
 2
 3 integer, parameter :: ikind = 4
 4 integer, parameter :: rkind = 8
 5
 6 integer(kind = ikind) :: isize, iproc, ierr
 7 integer(kind = ikind) :: i, j
 8
 9 include "mpif.h"
10 integer(kind = ikind) :: istat(MPI_STATUS_SIZE)
11
12 print*, 'Section 1'
13
14 ! initialize mpi
15 write(*, '(a)', advance='no'), 'Calling MPI_Init ...'
16 call MPI_Init(ierr)
17 write(*, '(a)') 'done'
18 print*, 'ierr = ', ierr
19 call MPI_Barrier(MPI_COMM_WORLD, ierr)
20 call MPI_Comm_Rank(MPI_COMM_WORLD, iproc, ierr)
21 call MPI_Comm_Size(MPI_COMM_WORLD, isize, ierr)
22 do i = 0,isize
23   call MPI_Barrier(MPI_COMM_WORLD, ierr)
24   if(iproc.eq.i) write(*, '(a, i3, a)') 'rank(', iproc, ') reporting'
25   call MPI_Barrier(MPI_COMM_WORLD, ierr)
26 enddo
27
28 ! shutdown MPI
29 call MPI_Barrier(MPI_COMM_WORLD, ierr)
30 call MPI_Finalize(ierr)
31
32 end program smear_sfs

这是输出的(定时)版本:

 Section 1
Calling MPI_Init ... Section 1
Calling MPI_Init ... Section 1
Calling MPI_Init ... Section 1
Calling MPI_Init ...done
 ierr =            0
rank(  0) reporting
done
 ierr =            0
rank(  1) reporting
done
 ierr =            0
rank(  2) reporting
done
 ierr =            0
rank(  3) reporting

real    0m45.350s
user    1m25.794s
sys     1m31.731s

程序会立即输出Section 1和以下Calling MPI_Init ...,但之后会在打印done和其余输出之前挂起很长时间。出于某种原因,这在MPI_Init上悬挂了很长时间,我无法弄清楚原因。

如果真的很重要,我第一次跑这个时,我的防火墙发出了一些奇怪的警告,声称我的电脑上发生了一些事情(来自orted.exe我认为是)但是我没有得到那个错误了。

我在Windows 8上通过cygwin64运行此程序并使用MPIf90进行编译。

感谢。

1 个答案:

答案 0 :(得分:1)

希望最后一次编辑:

我在OpenMPI用户邮件列表中询问过。在那里我得到了建议,它也可能是我的WLAN。

确实!这是我的WLAN,至少是我测试它的一半时间。另一次是我的局域网,我也用它来访问互联网。

所以:尝试在开始时停用LAN和WLAN>控制面板>网络和互联网>网络和共享中心>更改适配器设置 不过,这只是一种解决方法。


这不是一个真正的答案,但我想与这个令人烦恼的主题分享我5个小时的经验。 (我不时有问题)

我遇到了同样的问题:在编译和运行程序之后,它似乎挂了,但它最终会在一两分钟后起作用。

虽然我的笔记本电脑出现了问题,但我的台式电脑却没有。两者都运行在Win 7,cygwin 64位,OpenMPI版本1.8.3 r32794(ompi_info),g ++ v 4.8.3。我实际上后来同步了cygwin安装,它仍然无法正常工作,但它在重新启动后完成,所以我无法排除问题是某种程度上拙劣的cygwin安装。

当我在桌面PC上启动程序时,我的防火墙Comodo 5.10通知我关于orterun.exe(mpirun只是orterun的符号链接)和myprogram.exe。在我(永久)允许这两个程序后,启动的程序仍然没有恢复执行。取消程序并重新启动程序后,程序运行没有问题,这意味着它运行得很快。因此,在我看来,如果OpenMPI无法立即连接,它可能只有足够的错误处理。也许这与问题有某种关系。

我正在使用Comodo Firewall 5.10。在我的桌面上,绝对没有防火墙,甚至我的笔记本电脑上的Windows防火墙(停用)也没有。在我的笔记本上安装Comodo 5.10也没有任何帮助。但重启后一切正常,所以防火墙可能还没有完全到位吗?但安装程序没有提示我重新启动,防火墙已经工作,所以......

我的桌面电脑的编译版本确实在我的笔记本上运行了mpirun ......我想。唉,我无法复制这个,我现在试了几个小时。因此,我认为错误在于编译器或OpenMPI库。

将我的笔记本上的cygwin安装与桌面上的安装同步后,安装防火墙,我允许所有受影响的程序并重新启动我的笔记本终于工作了...我不确定究竟是什么解决了问题以及为什么要重启是必要的。

显然问题在我的笔记本上存在了几个月,所以我在没有问题解决的情况下重新启动笔记本。

其他人也有他们的VPN软件干扰OpenMPI并导致这些问题的故事,但我没有运行这样的软件。

编辑: 几个小时后问题又回来了! 我也毫无结果地尝试过的事情:

  • 关闭可能阻塞TCP-IP连接的程序
  • ping 127.0.0.1工作< 1ms
  • 以管理员身份运行bash
  • 从windows cmd运行orterun / mpirun而不是cygwin-bash
  • 完全停止Windows防火墙服务和Windows Defender
  • 使用MPI_Init(NULL,NULL);而不是MPI_Init(& argc,& argv);
  • 使用gcc编译而不是使用g ++
  • 该程序运行正常,如果我不用mpirun启动它,但它也不起作用,如果我用mpirun -n 1启动它
  • 更新Windows
  • 使用安全模式(使用网络驱动程序)
  • 尝试调试它(我无法对MPI_init调用进行有用的回溯)