Linux 串行程序比并行fortran更快
我试着测试fortran,看看我能从MPI串行编程中获得多少速度 我首先用以下方法编译程序:Linux 串行程序比并行fortran更快,linux,fortran,mpi,gfortran,Linux,Fortran,Mpi,Gfortran,我试着测试fortran,看看我能从MPI串行编程中获得多少速度 我首先用以下方法编译程序: mpif90 mpi\u pi\u reduce.f-o mpi\u pi 然后,由于我在本地化mpirun时遇到问题,我启动程序如下: /usr/bin/mpirun-np4./mpi\u pi 现在,当np=1时,我得到: real 0m0.063s user 0m0.049s sys 0m0.017s real 0m1.139s user 0m0.352s sys
mpif90 mpi\u pi\u reduce.f-o mpi\u pi
然后,由于我在本地化mpirun
时遇到问题,我启动程序如下:
/usr/bin/mpirun-np4./mpi\u pi
现在,当np=1时,我得到:
real 0m0.063s
user 0m0.049s
sys 0m0.017s
real 0m1.139s
user 0m0.352s
sys 0m0.045s
而如果我使用np=4,我会得到:
real 0m0.063s
user 0m0.049s
sys 0m0.017s
real 0m1.139s
user 0m0.352s
sys 0m0.045s
这是不现实的:-(!
是否可能使用/usr/bin/mpirun
,MPI不能正常工作?我没有接触示例代码,因此问题不可能是程序本身。
我有一个建议:
ifort(ifort)14.0.1 20131008
版权所有(C)1985-2013英特尔公司。保留所有权利。
和gfortran:
GNU Fortran(Ubuntu/Linaro 4.8.1-10ubuntu9)4.8.1
版权所有(C)2013免费软件基金会,< /代码> /P>
最后:
/usr/bin/mpirun-V
mpirun(开放式MPI)1.4.5
仅使用mpirun
命令时,我遇到的错误是:
/opt/intel/composer\u xe\u 2013\u sp1.1.106/mpirt/bin/intel64/mpirun:96::无法打开/opt/intel/composer\u xe\u 2013\u sp1.1.106/mpirt/bin/intel64/mpivars.sh
这就是我使用/usr/bin/mpirun
按建议启动代码的原因
非常感谢您的帮助。因为您只有一条错误消息要处理,所以您需要了解它无法打开的原因。/opt/intel/composer\u xe\u 2013\u sp1.1.106/mpirt/bin/intel64/mpivars.sh
检查此文件是否存在,并检查其权限,以允许运行该进程的任何用户执行该文件。由于您只有一条错误消息可处理,因此您需要了解它无法打开的原因。/opt/intel/composer\u xe\u 2013\u sp1.1.106/mpirt/bin/intel64/mpivars.sh
检查此文件是否存在,并检查其权限,以允许运行该进程的任何用户执行该文件。您的测试使用单核执行0.063秒
使用如此短的基准测试,您永远无法获得任何合理的计时:通信成本很高,对于同一主机上的单侧进程间通信,通常为1微秒,而浮点操作的数量级为纳秒。如果添加在屏障等中的等待时间,您会看到进程间通信通信与共享内存中的粒度完全不同
通过增加程序中的ROUNDS变量,您应该尝试在至少10秒的时间内以最快的速度运行基准测试,以消除初始化和最终确定所花费的时间
请注意,MPI_REDUCE是一个代价高昂的调用,它所花费的时间随着进程总数的增加而增加(例如,与MPI_SEND相反)。您应该将其移出循环,以进行比通信多得多的计算
如果您的目标不是学习MPI,而是并行化Monte Carlo代码(或某些“令人尴尬的并行”代码),那么您应该看看ZeroMQ库(),它具有包括Fortran在内的多种语言的绑定。使用该库,您将获得容错能力(如果一个进程崩溃,您的运行将继续),以及拥有灵活资源的可能性(您可以随时附加和分离客户端)。这非常有用,因为您无需等待群集上的所有资源空闲后再开始计算。只需提交连接到同一服务器的多个作业!您可以
查看这些幻灯片:在这里,您使用管道、套接字和XML/RPC实现了Pi的客户机/服务器实现。您可以使用Fortran和ZeroMQ毫不费力地完成同样的工作。您的测试需要使用单个核心的0m0.063s
使用如此短的基准测试,您永远无法获得任何合理的计时:通信成本很高,对于同一主机上的单侧进程间通信,通常为1微秒,而浮点操作的数量级为纳秒。如果添加在屏障等中的等待时间,您会看到进程间通信通信与共享内存中的粒度完全不同
通过增加程序中的ROUNDS变量,您应该尝试在至少10秒的时间内以最快的速度运行基准测试,以消除初始化和最终确定所花费的时间
请注意,MPI_REDUCE是一个代价高昂的调用,它所花费的时间随着进程总数的增加而增加(例如,与MPI_SEND相反)。您应该将其移出循环,以进行比通信多得多的计算
如果您的目标不是学习MPI,而是并行化Monte Carlo代码(或某些“令人尴尬的并行”代码),那么您应该看看ZeroMQ库(),它具有包括Fortran在内的多种语言的绑定。使用该库,您将获得容错能力(如果一个进程崩溃,您的运行将继续),以及拥有灵活资源的可能性(您可以随时附加和分离客户端)。这非常有用,因为您无需等待群集上的所有资源空闲后再开始计算。只需提交连接到同一服务器的多个作业!您可以
查看这些幻灯片:您有一个使用管道、套接字和XML/RPC的Pi客户机/服务器实现。您可以毫不费力地使用Fortran和ZeroMQ实现同样的功能。如果您设置np=2
?@HighPerformanceMark它给我real 0m0.082s用户0m0.102s sys 0m0.040s
,如果我重新启动,其振荡范围为0.072到0.084多次解算。这个“用户”时间不是每个处理器花费的所有时间的总和吗(因此随进程数线性增加)?此外,链接的MPI程序似乎在每个处理器上进行完全相同的计算,除非random_seed()给出不同的随机数序列…(因此结果总是相同的).如果您设置了np=2
?@H