【发布时间】: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 的使用方式?
-
如果您(暂时)关闭防火墙会怎样?
标签: windows-8 cygwin fortran mpi fortran90