串行及OpenMP程序编译及运行¶
在本超算系统上可运行C/C++、Fortran的串行程序,以及与OpenMP和MPI结合的并行程序。编译程序时,用户只需在登录节点上以相应的编译命令和选项进行编译即可(用户不应到其余节点上进行编译,以免影响系统效率。其它节点一般只设置了运行作业所需要的库路径等,未必设置了编译环境)。当前安装的编译环境主要为:
- C/C++、Fortran编译器:Intel、PGI [1] 和GNU编译器,支持OpenMP并行。
- MPI并行环境:HPC-X、Open MPI和Intel MPI并行环境。
安装目录为 /opt
等,系统设置采用module进行管理(参见[module]),用户可以采用下述方式之一等需设置自己所需的编译环境运行,如:
- 当前登录有效:
module load intel/2020
- 长期登录有效:在文件
~/.bashrc
中设置(设置完成后需要source ~/.bashrc
或重新登录以便设置生效):
module load intel/2020
注意
设置多次不同的有可能有先后顺序,例如对于Intel编译环境可以运行 icc -v
或 which icc
等命令查看确定实际使用的编译环境。
建议采用对一般程序来说性能较好的Intel编译器,用户也可以选择适合自己程序的编译器,以取得更好的性能。
本部分主要介绍串行C/C++ Fortran源程序和OpenMP并行程序的编译,MPI并行程序的编译将在后面介绍。
注意
Intel Parallel Studio XE Cluster版是旧的Intel编译器架构(已被称为Class版),Intel从2019年年底开始重点推出Intel oneAPI新编程模型架构,编译命令如下:
编译器版本 |
C |
C++ |
Fortran |
---|---|---|---|
Class |
icc |
icpc |
ifort |
OneAPI |
icx |
icpx |
ifx |
串行C/C++程序的编译¶
C/C++输入输出文件后缀与类型的关系¶
编译器默认将按照输入文件的后缀判断文件类型,见下表。
文件名 |
解释 |
动作 |
---|---|---|
filename.c
filename.C
filename.CC
|
C源文件
|
传给编译器
|
filename.cc
filename.cpp
filename.cxx
|
C++源文件
|
传给编译器
|
filename.a
|
静态链接库文件
|
传递给链接器
|
filename.so
|
动态链接库文件
|
|
filename.i
|
已预处理的文件
|
传递给标准输出
|
filename.o
|
目标文件
|
传递给链接器
|
filename.s
|
汇编文件
|
传递给汇编器
|
编译器默认将输出按照文件类型与后缀相对应,见下表。
文件名 |
解释 |
动作 |
---|---|---|
filename.i |
已预处理的文件 |
一般使用-p选项生成 |
filename.o |
目标文件 |
一般使用-c选项生成 |
filename.s |
汇编文件 |
一般使用-S选项生成 |
a.out |
默认生成的可执行文件 |
一般编译时没有指定-o、-c、-S等时生成 |
串行C/C++程序编译举例¶
- Intel C/C++编译器:
- 将C程序
your_prog.c
编译为可执行文件your_prog
:- Class:
icc -o your_prog your_prog.c
- OneAPI:
icx -o your_prog your_prog.c
- 将C++程序
your_prog.cpp
编译为可执行文件your_prog
:- Class:
icpc -o your_prog your_prog.cpp
- OneAPI:
icpx -o your_prog your_prog.cpp
- 将C程序
your_prog.c
编译为对象文件your_prog.o
而不是可执行文件:- Class:
icc -c your_prog.c
- OneAPI:
icx -c your_prog.c
- 将C程序
your_prog.c
编译为汇编文件your_prog.s
而不是可执行文件:- Class:
icc -S your_prog.c
- OneAPI:
icx -S your_prog.c
- 生成带有调试信息的可执行文件以用于调试:
- Class:
icc -g your_prog.c -o your_prog
- OneAPI:
icx -g your_prog.c -o your_prog
- 指定头文件路径
/alt_dir/include
编译:- Class:
icc -I/alt_dir/include -o your_prog your_prog.c
- OneAPI:
icx -I/alt_dir/include -o your_prog your_prog.c
- 指定库文件路径
/alt_dir/lib
及库文件libxyz.a
编译:- Class:
icc -L/alt_dir/lib -lxyz -o your_prog your_prog.c
- OneAPI:
icx -L/alt_dir/lib -lxyz -o your_prog your_prog.c
- PGI C/C++编译器:
- 将C程序
your_prog.c
编译为可执行文件your_prog
:pgcc -o your_prog your_prog.c
- 将C++程序
your_prog.cpp
编译为可执行文件your_prog
:pgCC -o your_prog your_prog.cpp
- 将C程序
your_prog.c
编译为对象文件your_prog.o
而不是可执行文件:pgcc -c your_prog.c
- 将C程序
your_prog.c
编译为汇编文件your_prog.s
而不是可执行文件:pgcc -S your_prog.c
- 生成带有调试信息的可执行文件以用于调试:
pgcc -g your_prog.c -o your_prog
- 指定头文件路径
/alt_dir/include
编译:pgcc -I/alt_dir/include -o your_prog your_prog.c
- 指定库文件路径
/alt_dir/lib
及库文件libxyz.a
编译:pgcc -L/alt_dir/lib -lxyz -o your_prog your_prog.c
- GNU C/C++编译器:
- 将C程序
your_prog.c
编译为可执行文件your_prog
:gcc -o your_prog your_prog.c
- 将C++程序
your_prog.cpp
编译为可执行文件your_prog
:g++ -o your_prog your_prog.cpp
- 将C程序
your_prog.c
编译为对象文件your_prog.o
而不是可执行文件:gcc -c your_prog.c
- 将C程序
your_prog.c
编译为汇编文件your_prog.s
而不是可执行文件:gcc -S your_prog.c
- 生成带有调试信息的可执行文件以用于调试:
gcc -g your_prog.c -o your_prog
- 指定头文件路径
/alt_dir/include
编译:gcc -I/alt_dir/include -o your_prog your_prog.c
- 指定库文件路径
/alt_dir/lib
及库文件libxyz.a
编译:gcc -L/alt_dir/lib -lxyz -o your_prog your_prog.c
串行Fortran程序的编译¶
Fortran输入输出文件后缀与类型的关系¶
编译器默认将按照输入文件的后缀判断文件类型,见下表。
文件名 |
解释 |
动作 |
---|---|---|
filename.a
|
静态链接库文件,多个.o文件的打包集合
|
传给编译器
|
filename.f
filename.i
filename.for
filename.i
filename.ftn
filename.i
filename.i
|
固定格式的Fortran源文件
|
被Fortran编译器编译
|
filename.fpp
filename.FPP
filename.F
filename.FOR
filename.FTN
|
固定格式的Fortran源文件
|
自动被Fortran编译器预处理后再被编译
|
filename.f90
filename.i90
|
自由格式的Fortran源文件
|
被Fortran编译器编译
|
filename.F90
|
自由格式的Fortran源文件
|
自动被Fortran编译器预处后再被编译
|
filename.s
|
汇编文件
|
传递给汇编器
|
filename.so
|
动态链接库文件,多个.o文件的打包集合
|
传递给链接器
|
filename.o
|
目标文件
|
传递给链接器
|
编译器默认将输出按照文件类型与后缀相对应,见下表。
文件名 |
解释 |
生成方式 |
---|---|---|
filename.o |
目标文件 |
编译时添加-c选项生成 |
filename.so |
共享库文件 |
编译时指定为共享型,如添加-shared,并不含-c选项 |
filename.mod |
模块文件 |
编译含有MODULE声明时的源文件生成 |
filename.s |
汇编文件 |
编译时添加-S选项生成 |
a.out |
默认生成的可执行文件 |
编译时没有指定-c、-S等时生成 |
串行Fortran程序编译举例¶
- Intel Fortran编译器(OneAPI编译器需将下面命令
ifort
变成ifx
):- 将Fortran 77程序
your_prog.for
编译为可执行文件your_prog
:ifort -o your_prog your_prog.for
- 将Fortran 90程序
your_prog.f90
编译为可执行文件your_prog
:ifort -o your_prog your_prog.f90
- 将Fortran 90程序
your_prog.90
编译为对象文件your_prog.o
而不是可执行文件:ifort -c your_prog.f90
- 将Fortran程序
your_prog.f90
编译为汇编文件your_prog.s
而不是可执行文件:ifort -S your_prog.f90
- 生成带有调试信息的可执行文件以用于调试:
ifort -g your_prog.f90 -o your_prog
- 指定头文件路径
/alt_dir/include
编译:ifort -I/alt_dir/include -o your_prog your_prog.f90
- 指定库文件路径
/alt_dir/lib
及库文件libxyz.a
编译:ifort -L/alt_dir/lib -lxyz -o your_prog your_prog.f90
- PGI Fortran编译器:
- 将Fortran 77程序
your_prog.for
编译为可执行文件your_prog
:pgf77 -o your_prog your_prog.for
- 将Fortran 90程序
your_prog.f90
编译为可执行文件your_prog
:pgf90 -o your_prog your_prog.f90
- 将Fortran程序
your_prog.f90
编译为对象文件your_prog.o
而不是可执行文件:pgf90 -c your_prog.f90
- 将Fortran程序
your_prog.f90
编译为汇编文件your_prog.s
而不是可执行文件:pgf90 -S your_prog.f90
- 生成带有调试信息的可执行文件以用于调试:
pgf90 -g your_prog.f90 -o your_prog
- 指定头文件路径
/alt_dir/include
编译:pgf90 -I/alt/include -o your_prog your_prog.f90
- 指定库文件路径
/alt_dir/lib
及库文件libxyz.a
编译:pgf90 -L/alt/lib -lxyz -o your_prog your_prog.f90
- GNU Fortran编译器:
- 将Fortran 77程序
your_prog.for
编译为可执行文件your_prog
:- gcc 4.x系列:
gfortran -o your_prog your_prog.for
- gcc 3.x系列:
g77 -o your_prog your_prog.for
- 将Fortran 90程序
your_prog.f90
编译为可执行文件your_prog
:gfortran -o your_prog your_prog.f90
- 将Fortran程序
your_prog.f90
编译为对象文件your_prog.o
而不是可执行文件:gfortran -c your_prog.f90
- 将Fortran程序
your_prog.f90
编译为汇编文件your_prog.s
而不是可执行文件:gfortran -S your_prog.f90
- 生成带有调试信息的可执行文件以用于调试:
gfortran -g your_prog.f90 -o your_prog
- 指定头文件路径
/alt_dir/include
编译:gfortran -I/alt/include -o your_prog your_prog.f90
- 指定库文件路径
/alt_dir/lib
及库文件libxyz.a
编译:gfortran -L/alt/lib -lxyz -o your_prog your_prog.f90
注意:g77
既不支持OpenMP,也不支持Fortran 90及之后的标准。
OpenMP程序的编译与运行¶
OpenMP程序的编译¶
Intel、PGI和GNU编译器都支持OpenMP并行,只需利用相关编译命令结合必要的OpenMP编译选项编译即可。对应此三种编译器的OpenMP编译选项:
- Intel编译器:-qopenmp(2015及之后版)
- PGI编译器:-mp
- GNU编译器:-fopenmp
采用这三种编译器的OpenMP源程序编译例子如下:
- Intel编译器:
- 将C程序
your_prog-omp.c
编译为可执行文件your_prog-omp
:- Class:
icc -qopenmp -o your_prog-omp your_prog.c
- OneAPI:
icx -qopenmp -o your_prog-omp your_prog.c
- 将Fortran 90程序
your_prog-omp.f90
编译为可执行文件your_prog-omp
:- Class:
ifort -qopenmp -o your_prog-omp your_prog.f90
- OneAPI:
ifx -qopenmp -o your_prog-omp your_prog.f90
- PGI编译器:
- 将C程序
your_prog-omp.c
编译为可执行文件your_prog-omp
:pgcc -mp -o your_prog-omp your_prog.c
- 将Fortran 90程序
your_prog-omp.f90
编译为可执行文件your_prog-omp
:pgf90 -mp -o your_prog-omp your_prog.f90
- GNU编译器:
- 将C程序
your_prog-omp.c
编译为可执行文件your_prog-omp
:gcc -fopenmp -o your_prog-omp your_prog.c
- 将Fortran 90程序
your_prog-omp.f90
编译为可执行文件your_prog-omp
:gfortran -fopenmp -o your_prog-omp your_prog.f90
OpenMP程序的运行¶
OpenMP程序的运行一般是通过在运行前设置环境变量OMP_NUM_THREADS
来控制线程数,比如在Bash中利用export OMP_NUM_THREADS=40
设置使用40个线程运行。
注意
本超算系统为节点内共享内存节点间分布式内存的架构,因此只能在一个节点上的CPU之间运行同一个OpenMP程序作业,在提交作业时需要使用相应选项以保证在同一个节点运行。