我试着测试一个fortranMPI program来看看我能从mpi方面的串行编程中获得多少速度。
我首先用以下方法编译程序:mpif90 mpi_pi_reduce.f -o mpi_pi
然后,由于我在本地化mpirun
时遇到问题,我启动了如下程序:/usr/bin/mpirun -np 4 ./mpi_pi
现在,当np=1时,我得到:
real 0m0.063s
user 0m0.049s
sys 0m0.017s
当我使用np=4时,我得到:
real 0m1.139s
user 0m0.352s
sys 0m0.045s
这是不现实的:-(!
使用
/usr/bin/mpirun
时,mpi是否可能无法正常工作?我不接触示例代码,所以问题不可能是程序本身。我知道:
ifort (IFORT) 14.0.1 20131008Copyright (C) 1985-2013 Intel Corporation. All rights reserved.
格佛特兰:
GNU Fortran (Ubuntu/Linaro 4.8.1-10ubuntu9) 4.8.1Copyright (C) 2013 Free Software Foundation, Inc.
最后:
/usr/bin/mpirun -Vmpirun (Open MPI) 1.4.5
我只使用
mpirun
命令的错误是:/opt/intel/composer_xe_2013_sp1.1.106/mpirt/bin/intel64/mpirun: 96: .: Can't open /opt/intel/composer_xe_2013_sp1.1.106/mpirt/bin/intel64/mpivars.sh
这就是为什么我使用
/usr/bin/mpirun
来启动建议的代码here。非常感谢你的帮助。
最佳答案
你的测试需要一个单核0.063秒!
使用如此短的基准测试,您将永远无法获得任何合理的时间安排:通信成本很高,对于同一主机上的单边进程间通信,通常为1微秒,而浮点操作的顺序为纳秒。如果您将等待时间添加到屏障等中,您会发现进程间通信的粒度与共享内存中的完全不同。
通过增加程序中的rounds变量,您应该尝试以至少10秒的时间为最快的运行目标基准,以消除在初始化和完成过程中花费的时间。
注意,mpi_reduce是一个昂贵的调用,它所需的时间随着进程总数的增加而增加(例如,与mpi_send相反)。你应该把它移到循环之外,以便进行比通信多得多的计算。
如果您的目标不是学习mpi,而是并行化monte carlo代码(或一些“令人尴尬的并行”代码),那么您应该看看zeromq库(http://zeromq.org),它在许多语言(包括fortran)中都有绑定。使用这个库,您将得到容错(如果一个进程崩溃,您的运行继续),并且可能具有灵活的资源(您可以随时连接和分离客户端)。这非常有用,因为在开始计算之前,不需要等待集群上的所有资源都空闲。只需提交多个连接到同一服务器的作业!你可以
看看这些幻灯片:http://irpf90.ups-tlse.fr/files/parallel_programming.pdf其中有一个使用管道、套接字和xml/rpc的pi客户机/服务器实现。您可以使用Fortran和ZeroMQ轻松完成相同的操作。