Pan*_*oro 1 linux fortran mpi gfortran
我尝试测试一个 fortran MPI 程序,看看我可以从 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
Run Code Online (Sandbox Code Playgroud)
而如果我使用 np=4 我得到:
real 0m1.139s
user 0m0.352s
sys 0m0.045s
Run Code Online (Sandbox Code Playgroud)
这是不现实的 :-( !是否有可能,使用 /usr/bin/mpirun,MPI 无法正常工作?我没有接触示例代码,所以问题不可能是程序本身。我有:
ifort (IFORT) 14.0.1 20131008
Copyright (C) 1985-2013 Intel Corporation. All rights reserved.
和 gfortran:
GNU Fortran (Ubuntu/Linaro 4.8.1-10ubuntu9) 4.8.1
Copyright (C) 2013 Free Software Foundation, Inc.
最后:
/usr/bin/mpirun -V
mpirun (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按照此处的建议使用来启动代码的原因。
非常感谢您的帮助。
您的单核测试需要 0m0.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,在那里您有 Pi 的客户端/服务器实现)使用管道、套接字和 XML/RPC。你可以毫不费力地使用 Fortran 和 ZeroMQ 来做同样的事情。