XRC0808087的个人博客分享 http://blog.sciencenet.cn/u/XRC0808087

博文

Fortran并行(MPI)编程个人总结

已有 1380 次阅读 2019-11-17 15:29 |系统分类:科研笔记

Fortran是数值计算领域的主流编程语言。并行计算可以减小Fortran大规模计算的时间,现在并行一般用MPIMessage Passing Interface)方式。MPI有很多并行函数,这让很多新手望而却步。但是一般情况下,只要使用一些关键的并行函数,只要增加十几行的代码就可以将原来的Fortran程序改成并行计算的程序。下面通过一个例子来说明MPI的配置方式(见红色部分,这里以只对do循环进行并行)。

use mpi   !调用mpi的库函数

integer::err, cpuid, num_cpu

real(DP),allocatable::BCD(:,:),BCD_mpi(:,:)      !定义mpi数组

!> initial the environment of mpi

#if defined (MPI)     

call MPI_INIT ( ierr )       

call MPI_COMM_SIZE   (MPI_COMM_WORLD, num_cpu, ierr)

call MPI_COMM_RANK   (MPI_COMM_WORLD, cpuid, ierr) 

#endif 

mu_min=-0.3; n_mu=300; d_mu=0.002;

allocate(BCD_mpi(n_mu,3),BCD(n_mu,3))

do i= 1+ cpuid, n_mu, num_cpu   ! 并行计算,分发任务给每一个CPU

    mu=mu_min+i*d_mu

    call sumBCD(mu, Dxz, Dyz)

    BCD(i,:)=(/mu,Dxz,Dyz/)

enddo

#if defined (MPI)

call mpi_allreduce(BCD,BCD_mpi,size(BCD_mpi),mpi_double_precision,mpi_sum,mpi_comm_world,ierr)  ! 一个核心算一个,然后汇总至BCD _mpi变量中。

#else

  BCD_mpi=BCD

#endif

open(unit=11, file='BCD.dat')

do i=1,n_mu

    if (cpuid==0)  write(BCD_file,   '(10E16.8)') BCD_mpi(i,:)  ! 输出结果到文件中

enddo

#if defined (MPI)

  call mpi_finalize(ierr)

#endif

函数解释:

1.       MPI_Init模块用来初始化MPI执行环境,建立多个MPI进程之间的联系,为后续通信做准备。

2.       MPI_COMM_SIZE用来标识相应进程组中有多少个进程,MPI_COMM_RANK为进程标识获取函数。MPI_Comm_size函数的第二个参数里返回通信子的进程数(num_cpu)MPI_Comm_rank函数的第二个参数返回正在调用进程在通信子中的进程号(cpuid)

3.       规约函数MPI_Reduce将通信子内各进程的同一个变量参与规约计算,并向指定的进程输出计算结果。规约并广播函数MPI_Allreduce,在计算规约的基础上,将计算结果分发到每一个进程中MPI_allreduce/MPI _reduce数据类型的选择有:MPI_REALMPI_INTEGERMPI_LOGICALMPI_DOUBLE_PRECISIONMPI_COMPLEXMPI_DOUBLE_COMPLEXMPI_INTEGER1等。

4.       MPI_Finalize为结束MPI执行环境函数。

更详细的参数介绍可以参考《并行程序设计导论》https://book.2cto.com/201211/9324.html

说  明:

1.   sumBCD为定义的计算模块,输入为mu,输出为DxzDyz

2.  输出时,需要使用if (cpuid==0)  write(*,*)  'xxx'语句,否则每一个核心都会输出到文件中。

3.  编译方法:

mpif90  -fpp  -DMPI   MPI_test.f90  -o  MPI_test.x

若无-fpp,则不识别#,编译会报错。

4.   运行:

mpirun  -np  6  ./ MPI_test.x            mpiexec  -np  6  ./ MPI_test.x



http://blog.sciencenet.cn/blog-1502061-1206489.html

上一篇:用Aflow数据库查看晶体的对称操作动画
下一篇:群论的应用1:电介质晶体的张量元和电介质晶体的分类

1 唐刚

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2020-3-29 08:34

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部