我获得了在集群上运行的代码,.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:意味着什么以及之后的那一行?
答案 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