MPI_Init() 需要很长时间才能运行
Posted
技术标签:
【中文标题】MPI_Init() 需要很长时间才能运行【英文标题】:MPI_Init() taking a very long time to run 【发布时间】:2013-10-11 17:17:40 【问题描述】:我有一个问题的最小示例,我只是启动 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 进行编译。
谢谢。
【问题讨论】:
你使用的是什么版本的我认为是 Open MPI? 我使用的是 OpenMPI 1.7.1 我无法在 Ubuntu Linux 上重现这一点,我得到的 (real, user, sys) 值为 (1.054s, 0.048s, 0.024s)。 我认为这不是代码本身的问题,因为我之前在其他平台上编写过 MPI。有谁知道 cygwin 或 Windows 8 会如何影响 MPI 的使用方式? 如果您(暂时)关闭防火墙会怎样? 【参考方案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 安装以某种方式搞砸了。
当我在台式电脑上启动程序时,我的防火墙 Comodo 5.10 通知我有关 orterun.exe(mpirun 只是 orterun 的符号链接)和 myprogram.exe。在我(永久)允许这两个程序之后,启动的程序仍然没有恢复执行。取消程序并重新启动后,程序运行没有问题,这意味着它运行得很快。因此,在我看来,如果 OpenMPI 不能立即连接,它可能只有不足的错误处理。也许这与问题有关。
我正在使用 Comodo 防火墙 5.10。在我的桌面上,绝对没有防火墙,甚至没有我笔记本上的 Windows 防火墙(已停用)。在我的笔记本上安装 Comodo 5.10 也没有帮助。但是重启后一切正常,所以也许防火墙还没有完全到位?但是安装程序没有提示我重新启动,并且防火墙已经在工作,所以...
从我的台式电脑编译的版本确实在我的笔记本电脑上运行了 mpirun...我想。唉,我无法复制这个,我现在尝试了几个小时。因此,我认为错误在于编译器或 OpenMPI 库。
在将我的笔记本上的 cygwin 安装与桌面上的同步后,安装防火墙以允许所有受影响的程序并重新启动我的笔记本,它终于可以工作了...我不确定究竟是什么解决了这个问题以及为什么要重新启动是必要的。
显然这个问题在我的笔记本上存在好几个月了,所以我之前确实重启了笔记本,但问题没有得到解决。
其他人也有他们的 *** 软件干扰 OpenMPI 并导致这些问题的故事,但我没有运行这样的软件。
编辑: 几个小时后问题又回来了! 我也徒劳地尝试过的事情:
关闭可能阻塞 TCP-IP 连接的程序 ping 127.0.0.1 工作 以管理员身份运行 bash 从 windows cmd 而不是 cygwin-bash 运行 orterun/mpirun 完全停止 Windows 防火墙服务和 Windows Defender 使用 MPI_Init(NULL,NULL);而不是 MPI_Init(&argc,&argv); 使用 gcc 而不是 g++ 编译 如果我不使用 mpirun 启动程序,该程序运行良好,但如果我使用 mpirun -n 1 启动它,它也无法运行 更新 Windows 使用安全模式(使用网络驱动程序) 尝试调试它(我无法获得对 MPI_init 调用的有用回溯)【讨论】:
您应该将此作为新问题发布,并在Open MPI User mailing list 上提问。在各种 Open MPI 框架中有许多 MCA 参数可用于启用详细模式,这些参数可用于调试此类问题。以上是关于MPI_Init() 需要很长时间才能运行的主要内容,如果未能解决你的问题,请参考以下文章
为啥 train_test_split 需要很长时间才能运行?
mongoDB mapreduce需要很长时间才能运行3m文件
Spark SQL + Window + Streaming 问题 - 使用 Spark Streaming 运行时,Spark SQL 查询需要很长时间才能执行