运行MPI fortran代码示例make文件

时间:2017-09-05 17:16:17

标签: linux makefile fortran

我获得了在集群上运行的代码,.sh文件内容如下:

compiler  =  mpifort

in8.3     =  mac-ns-2d.8.3.f90

out       =  a.out

inc       =  hypre/include

libs      =  src/hypre/lib

opts      =  -O4

8.3:
    $(compiler) $(opts) -I$(inc) $(in8.3) -o $(out) -L$(libs) -lHYPRE -lm -lstdc++

我看到第一行是什么,这是我的编译器mpifortran,但是第二行是什么意思,在8.3中? 我也知道out,inc,libs的含义,但是opts -04的目的是什么?8.3:意味着什么以及之后的那一行?

2 个答案:

答案 0 :(得分:1)

这是一个标准的Unix Makefile,但它使用了奇怪的变量名。

前几行是所有作业:

compiler  =  mpifort
in8.3     =  mac-ns-2d.8.3.f90
out       =  a.out
inc       =  hypre/include
libs      =  src/hypre/lib
opts      =  -O4

这些基本上将字符串分配给变量。例如,稍后在Makefile中,可以使用$(out)并取代a.out。这是收集以后可能需要调整的所有内容的常用方法,例如要使用的编译器,编译标记一个人使用和其他东西。

您具体询问了opts。该变量的值为-O4,它是一个编译器标志,用于启用"优化级别4" (通常是最高的优化级别,但请查看编译器的手册)。

接下来的两行是目标和构建目标的规则:

8.3:
    $(compiler) $(opts) -I$(inc) $(in8.3) -o $(out) -L$(libs) -lHYPRE -lm -lstdc++

这两行中的第二行应使用单个标签缩进。

我不打算描述目标是什么以及制定目标的规则是什么,除了说make将"制造"使用指定规则的Makefile的第一个目标。在运行顶级目标的规则之前,目标可能具有需要考虑的依赖关系(其他目标)。这不是这种情况。

如您所见,最后一行使用先前定义的变量来编译程序。

运行make将产生:

$ make
mpifort -O4 -Ihypre/include mac-ns-2d.8.3.f90 -o a.out -Lsrc/hypre/lib -lHYPRE -lm -lstdc++
mpifort: not found
*** Error 1 in /tmp/shell-ksh.l1TMWqET (Makefile:14 '8.3')

由于我没有安装mpifort(编译器),我收到了错误消息,但您也可以看到make尝试执行的命令。这对应于此Makefile的最后一行,所有变量都被其值替换。

我建议您在make和Makefiles上找一个教程。

答案 1 :(得分:1)

嗯,这里使用Makefile的格式和方式很奇怪。没关系,但可以采用略有不同的方式。

我们说你有档案: mac-ns-2d.8.3.f90

program main
  use mpi

  integer error, id, p
  call MPI_Init ( error )
  call MPI_Comm_size ( MPI_COMM_WORLD, p, error )
  call MPI_Comm_rank ( MPI_COMM_WORLD, id, error )
  write (*,*) 'Hello: ', id, '/', p
  call MPI_Finalize ( error )
end

然后,您可以稍微修改您的Makefile,使其更加优雅"

compiler  =  mpifort
#I am commenting out these two to make compilation go trhough
#inc       =  hypre/include
#libs      =  src/hypre/lib
opts      =  -O4

a.out: mac-ns-2d.8.3.f90
    $(compiler) $(opts) -I$(inc) -L$(libs) -lm -lstdc++ $< -o $@

clean:
    -rm a.out

而且,你可以简单地制作目标并运行代码

> make
mpifort -O4 -I -L -lm -lstdc++ mac-ns-2d.8.3.f90 -o a.out
> mpirun -np 2 ./a.out
 Hello:            0 /           2
 Hello:            1 /           2

我个人原本会改变这一行

a.out: mac-ns-2d.8.3.f90

更合适的东西,比如

name_of_my_executable: mac-ns-2d.8.3.f90