串行及OpenMP程序编译及运行

在本超算系统上可运行C/C++、Fortran的串行程序,以及与OpenMP和MPI结合的并行程序。编译程序时,用户只需在登录节点(login01、login02)上以相应的编译命令和选项进行编译即可(用户不应到其余节点上进行编译,以免影响系统效率。其它节点一般只设置了运行作业所需要的库路径等,未必设置了编译环境)。当前安装的编译环境主要为:

  • C/C++、Fortran编译器:Intel、PGI [1] 和GNU编译器,支持OpenMP并行。

  • MPI并行环境:HPC-X、Open MPI和Intel MPI并行环境。

安装目录为 /opt 等,系统设置采用module进行管理(参见[module]),用户可以采用下述方式之一等需设置自己所需的编译环境运行,如:

  • module load intel/2020

  • 在中设置(设置完成后需要source ~/.bashrc或重新登录以便设置生效):

. /opt/intel/2020/bin/compilervars.sh intel64

注意:在中设置的级别有可能要高于使用module load设置的,可以运行icc -vwhich icc等命令查看实际使用的编译环境。

建议采用对一般程序来说性能较好的Intel编译器,用户也可以选择适合自己程序的编译器,以取得更好的性能。

本部分主要介绍串行C/C++ Fortran源程序和OpenMP并行程序的编译,MPI并行程序的编译将在后面介绍。

串行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

默认生成的可执行文件

串行C/C++程序编译举例

  • Intel C/C++编译器:

    • 将C程序yourprog.c编译为可执行文件yourprog:
      icc -o yourprog yourprog.c
    • 将C++程序yourprog.cpp编译为可执行文件yourprog:
      icpc -o yourprog yourprog.cpp
    • 将C程序yourprog.c编译为对象文件yourprog.o而不是可执行文件:
      icc -c yourprog.c
    • 将C程序yourprog.c编译为汇编文件yourprog.s而不是可执行文件:
      icc -S yourprog.c
    • 生成带有调试信息的可执行文件以用于调试:
      icc -g yourprog.c -o yourprog
    • 指定头文件路径编译:
      icc -I/alt/include -o yourprog yourprog.c
    • 指定库文件路径及库名编译:
      icc -L/alt/lib -lxyz -o yourprog yourprog.c
  • PGI C/C++编译器:

    • 将C程序yourprog.c编译为可执行文件yourprog:
      pgcc -o yourprog yourprog.c
    • 将C++程序yourprog.cpp编译为可执行文件yourprog:
      pgCC -o yourprog yourprog.cpp
    • 将C程序yourprog.c编译为对象文件yourprog.o而不是可执行文件:
      pgcc -c yourprog.c
    • 将C程序yourprog.c编译为汇编文件yourprog.s而不是可执行文件:
      pgcc -S yourprog.c
    • 生成带有调试信息的可执行文件以用于调试:
      pgcc -g yourprog.c -o yourprog
    • 指定头文件路径编译:
      pgcc -I/alt/include -o yourprog yourprog.c
    • 指定库文件路径及库名(-l)编译:
      pgcc -L/alt/lib -lxyz -o yourprog yourprog.c
  • GNU C/C++编译器:

    • 将C程序yourprog.c编译为可执行文件yourprog: gcc -o yourprog yourprog.c

    • 将C++程序yourprog.cpp编译为可执行文件yourprog:
      g++ -o yourprog yourprog.cpp
    • 将C程序yourprog.c编译为对象文件yourprog.o而不是可执行文件:
      gcc -c yourprog.c
    • 将C程序yourprog.c编译为汇编文件yourprog.s而不是可执行文件:
      gcc -S yourprog.c
    • 生成带有调试信息的可执行文件以用于调试:
      gcc -g yourprog.c -o yourprog
    • 指定头文件路径编译:
      gcc -I/alt/include -o yourprog yourprog.c
    • 指定库文件路径及库名编译:
      gcc -L/alt/lib -lxyz -o yourprog yourprog.c

串行Fortran程序的编译

Fortran输入输出文件后缀与类型的关系

编译器默认将按照输入文件的后缀判断文件类型,见下表。

输入文件后缀与文件类型的关系

文件名

解释

动作

filename.a

静态链接库文件,多个.o 文件的打包集合

传给编译器

filename.f filename.for filename.ftn 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时生成

串行Fortran程序编译举例

  • Intel Fortran编译器:

    • 将Fortran 77程序yourprog.for编译为可执行文件yourprog:
      ifort -o yourprog yourprog.for
    • 将Fortran 90程序yourprog.f90编译为可执行文件yourprog:
      ifort -o yourprog yourprog.f90
    • 将Fortran 90程序yourprog.90编译为对象文件yourprog.o而不是可执行文件:
      ifort -c yourprog.f90
    • 将Fortran程序yourprog.f90编译为汇编文件yourprog.s而不是可执行文件:
      ifort -S yourprog.f90
    • 生成带有调试信息的可执行文件以用于调试:
      ifort -g yourprog.f90 -o yourprog
    • 指定头文件路径编译:
      ifort -I/alt/include -o yourprog yourprog.f90
    • 指定库文件路径及库名编译:
      ifort -L/alt/lib -lxyz -o yourprog yourprog.f90
  • PGI Fortran编译器:

    • 将Fortran 77程序yourprog.for编译为可执行文件yourprog:
      pgf77 -o yourprog yourprog.for
    • 将Fortran 90程序yourprog.f90编译为可执行文件yourprog:
      pgf90 -o yourprog yourprog.f90
    • 将Fortran程序yourprog.f90编译为对象文件yourprog.o而不是可执行文件:
      pgf90 -c yourprog.f90
    • 将Fortran程序yourprog.f90编译为汇编文件yourprog.s而不是可执行文件:
      pgf90 -S yourprog.f90
    • 生成带有调试信息的可执行文件以用于调试:
      pgf90 -g yourprog.f90 -o yourprog
    • 指定头文件路径编译:
      pgf90 -I/alt/include -o yourprog yourprog.f90
    • 指定库文件路径及库名编译:
      pgf90 -L/alt/lib -lxyz -o yourprog yourprog.f90
  • GNU Fortran编译器:

    • 将Fortran 77程序yourprog.for编译为可执行文件yourprog:

      • gcc 4.x系列:gfortran -o yourprog yourprog.for

      • gcc 3.x系列:g77 -o yourprog yourprog.for

    • 将Fortran 90程序yourprog.f90编译为可执行文件yourprog:
      gfortran -o yourprog yourprog.f90
    • 将Fortran程序yourprog.f90编译为对象文件yourprog.o而不是可执行文件:
      gfortran -c yourprog.f90
    • 将Fortran程序yourprog.f90编译为汇编文件yourprog.s而不是可执行文件:
      gfortran -S yourprog.f90
    • 生成带有调试信息的可执行文件以用于调试:
      gfortran -g yourprog.f90 -o yourprog
    • 指定头文件路径编译:
      gfortran -I/alt/include -o yourprog yourprog.f90
    • 指定库文件路径及库名编译:
      gfortran -L/alt/lib -lxyz -o yourprog yourprog.f90

注意:g77既不支持OpenMP,也不支持Fortran 90及之后的标准。

OpenMP程序的编译与运行

OpenMP程序的编译

Intel、PGI和GNU编译器都支持OpenMP并行,只需利用相关编译命令结合必要的OpenMP编译选项编译即可。对应此三种编译器的OpenMP编译选项:

  • Intel编译器:-qopenmp(2015及之后版)

  • PGI编译器:-mp

  • GNU编译器:-fopenmp

采用这三种编译器的OpenMP源程序编译例子如下:

  • Intel编译器:

    • 将C程序yourprog-omp.c编译为可执行文件yourprog-omp:
      icc -qopenmp -o yourprog-omp yourprog.c
    • 将Fortran 90程序yourprog-omp.f90编译为可执行文件yourprog-omp:
      ifort -qopenmp -o yourprog-omp yourprog.f90
  • PGI编译器:

    • 将C程序yourprog-omp.c编译为可执行文件yourprog-omp:
      pgcc -mp -o yourprog-omp yourprog.c
    • 将Fortran 90程序yourprog-omp.f90编译为可执行文件yourprog-omp:
      pgf90 -mp -o yourprog-omp yourprog.f90
  • GNU编译器:

    • 将C程序yourprog-omp.c编译为可执行文件yourprog-omp:
      gcc -fopenmp -o yourprog-omp yourprog.c
    • 将Fortran 90程序yourprog-omp.f90编译为可执行文件yourprog-omp:
      gfortran -fopenmp -o yourprog-omp yourprog.f90

OpenMP程序的运行

OpenMP程序的运行一般是通过在运行前设置环境变量OMP_NUM_THREADS来控制线程数,比如在BASH中利用export OMP_NUM_THREADS=40设置使用40个线程运行。

注意,本系统为节点内共享内存节点间分布式内存的架构,因此只能在一个节点上的CPU之间运行同一个OpenMP程序作业,在提交作业时需要使用相应选项以保证在同一个节点运行。