串行程序比并行fortran更快

时间:2016-01-05 15:13:37

标签: linux fortran mpi gfortran

我尝试测试一个fortran MPI 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 (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按照建议here启动代码的原因。

非常感谢你的帮助。

2 个答案:

答案 0 :(得分:4)

你的测试需要0m0.063s,只有一个核心!

您将永远无法通过如此短的基准测试获得任何合理的时序:通信费用昂贵,对于同一主机上的单侧进程间通信通常为1微秒,而浮点运算按照以下顺序进行:纳秒。如果您添加等待障碍等的时间,您会发现进程间通信与共享内存中的粒度完全不同。

通过增加程序中的ROUNDS变量,您应该尝试以最快的运行时间为至少10秒的基准测试,以消除初始化和完成所花费的时间。

请注意,MPI_REDUCE是一项昂贵的调用,其中所需的时间会随着进程总数而增加(例如,与MPI_SEND相反)。你应该将它移到循环之外,以进行比通信更多的计算。

如果您的目标不是学习MPI而是并行化蒙特卡罗代码(或者某些"令人尴尬的并行"代码),那么您应该看一下具有绑定的ZeroMQ库(http://zeromq.org)包括Fortran在内的多种语言。使用此库,您将获得容错(如果一个进程崩溃,您的运行继续),并且可以拥有灵活的资源(您可以随时附加和分离客户端)。这非常有用,因为在计算开始之前,您不需要等待群集上的所有资源都是空闲的。只需提交连接到同一服务器的多个作业!您可以 看看这些幻灯片:http://irpf90.ups-tlse.fr/files/parallel_programming.pdf你有使用管道,套接字和XML / RPC的Pi的客户端/服务器实现。你可以毫不费力地使用Fortran和ZeroMQ来做同样的事情。

答案 1 :(得分:1)

由于您只有一条错误消息可供使用,因此您需要找出无法打开/opt/intel/composer_xe_2013_sp1.1.106/mpirt/bin/intel64/mpivars.sh的原因。

检查此文件是否存在并检查其上的权限是否允许由运行该进程的任何用户执行该文件。