抱歉,我不确定这是在此处问还是在 Stack Overflow 上问更好,但这是在全新的 Fedora 39 安装中进行的,并且我已经使用软件包(通过 dnf 安装)mpich-devel、openmpi-devel 和(来自linux-homebrew) openmpi 和我遇到同样的问题。我想这与系统有关,这就是为什么我认为最好在这里问。
基本上,如果我尝试运行包含 MPI_Init 的 MPI 程序,它确实会运行,但实际启动需要很长时间。它也不会立即出现top
;似乎由于某种原因被推迟了。当它出现时,它的运行速度和我预期的一样快。这是一个简单的 Fortran 语言的 hello world MPI 程序:
program hello_world
use mpi
implicit none
integer :: mpi_size, mpi_rank
integer :: ierr
double precision :: t1, t2
call MPI_Init(ierr)
t1 = MPI_Wtime()
call MPI_Comm_size(MPI_COMM_WORLD, mpi_size, ierr)
call MPI_Comm_rank(MPI_COMM_WORLD, mpi_rank, ierr)
print*, "Hello from rank ", mpi_rank, " of ", mpi_size, "."
t2 = MPI_Wtime()
print*, "time for full program", t2-t1
call MPI_Finalize(ierr)
end program hello_world
我可以用 mpif90 编译它(没有错误),并且可以延迟几分钟运行它。我查找了可能导致此问题的原因,并在类似的帖子中建议关闭其他程序并禁用 wifi(不知道为什么?),但这些都没有帮助。
这是输出time mpirun -np 2 ./a.out
Hello from rank 0 of 2 .
time for full program 1.3940195000000001E-002
Hello from rank 1 of 2 .
time for full program 1.4017349000000000E-002
real 2m27.524s
user 0m0.033s
sys 0m0.163s
作为比较,这里有一个更简单的 hello world 程序,
program hello
print *, 'Hello, World!'
end program hello
如果我使用 进行编译mpif90
,并对其计时(这里使用一个处理器运行以与 gfortran 进行比较),我得到:
Hello, World!
real 1m13.201s
user 0m0.016s
sys 0m0.074s
./a.out
使用 gfortran,(如果我使用or运行并不重要mpirun -np 1 ./a.out
)
Hello, World!
real 0m0.002s
user 0m0.001s
sys 0m0.001s
看起来它也间歇性地工作,无需等待。 (足以让我删除这个问题,以为更新修复了它,但当我再次运行它时,问题又回来了)
编辑:看起来问题出在MPI_Init
某种程度上。您可以拨打电话,例如
call date_and_time(values=values)
print *, values(5),":",values(6),":",values(7),":",values(8)
求某条线路的时间,瓶颈是MPI_Init
。
示例: 程序开始时间:
17 : 20 : 6 : 221
后MPI_Init
:
17 : 21 : 21 : 128
后MPI_Finalize
:
17 : 21 : 21 : 132
答案1
我刚刚解决了一个类似的问题,我的整体mpiexec -n 4 ./my_program
运行了 90 多秒,然后才真正做任何事情。程序本身在没有 MPI 的情况下运行约 0.15 秒。
解决方案是禁用所有网络连接。(WiFi、VPN...)这将运行时间缩短mpiexec
至不到 1 秒。
我已通过数百台设备连接到 eduroam WiFi,并且拥有公共 IP 地址。这可能是由于后台网络超时的一些问题造成的。
有人已经在 Cygwin 邮件列表中解决了类似的问题 https://sourceware.org/legacy-ml/cygwin/2016-12/msg00192.html。我在运行 Kernel 6.6.26、OpenMPI 5.0.2 和 g++ 12.3.0 的 Linux 机器上面临同样的问题,所以这个问题可能不仅仅与 Windows 机器和 Cygwin 有关。
设置-H localhost
或没有帮助,效果与第一段中没有这些参数的-H 127.0.0.1
运行相同。mpiexec