我有一个问题的最小示例,我只是启动 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 进行编译。
谢谢。