4

我有一个问题的最小示例,我只是启动 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我认为是这样),但我不再收到那个错误了。

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

谢谢。

4

1 回答 1

1

希望最后一次编辑:

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

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

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


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

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

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

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

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

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

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

显然这个问题在我的笔记本上存在好几个月了,所以我之前确实重新启动了笔记本,但问题没有得到解决。

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

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

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