串行及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 -vwhich 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程序作业,在提交作业时需要使用相应选项以保证在同一个节点运行。