“科学与工程计算国家重点实验室”
SGI Origin3800 超级服务器用户指南

科学与工程计算国家重点实验室

Last modified: September 23, 2005



[o3800.jpg]



这是由几位用户整理的实验室 SGI Origin 3800 并行机的简单使用说明。欢迎大家 共同对它进行改进、完善。

本文档的 PDF 版本位于: http://lsec.cc.ac.cn/chinese/lsec/doc/o3800.pdf

Contents

    1  登录

    2  MPI 程序的编译、链接与运行
        2.1  编译与链接
        2.2  优化编译可选项
        2.3  大数组程序
        2.4  MPI 程序的运行

    3  OpenMP 程序的编译、链接与运行
        3.1  编译开关
        3.2  自动生成并行程序
        3.3  OpenMP 程序的运行

    4  链接 BLAS 库

    5  作业调度系统
        5.1  作业的提交
            5.1.1  通过 bsub 命令提交作业
            5.1.2  通过作业脚本提交作业
        5.2  作业监控与管理命令

    6  在线文档

1  登录

Linux/UNIX 用户可用下述命令登录到 O3800:

ssh o3800

ssh o3800.cc.ac.cn

ssh 159.226.92.74

Windows 用户可以从 http://www.ssh.org 下载或购买 SSH 客户程序, 或是下载其它免费 SSH 客户程序,如:http://sshwindows.sourceforge.net/

2  MPI 程序的编译、链接与运行

2.1  编译与链接

Fortran 77, Fortran 90, C 和 C++ 程序编译命令:

f77 filename.f -lmpi			# Fortran 77 程序
f90 filename.f90 -lmpi			# Fortran 90 程序
cc filename.c -lmpi			# C 程序
CC filename.C -lmpi++ -lmpi		# C++ 程序

注意:O3800 上的编译器缺省生成 32 位代码。如果希望生成 64 位代码则需要使用相应的 开关 (可选项),如:

f90 -64 filename.f90 -lmpi
cc -64 filename.c -lmpi

2.2  优化编译可选项

几个基本优化选项:-O0, -O1, -O2, -O3, -Ofast

f90 -O1 myprogram.f90 -lmpif90 -Ofast myprogram.f90 两种方法编译速度相差很大,可达 5 倍以上。但是 -Ofast 对程序的通用性要求较高,一些老的 Fortran 可能编译通 不过。一个比较有效的编译可与其他编译选项结合使用。

其它优化可参看 O3800 上的 man page (如用命令 man f90 可显示 Fortran 90 编译器的使用说明)。或阅读 O3800 的在线文档 (http://o3800.cc.ac.cn/infosearch)。

2.3  大数组程序

系统缺省的堆栈大小是 65536KB, 因此有些大数组程序无法直接运行, 用命令 “limit stacksize unlimited” 可以扩大堆栈空间至 524288KB。

也可以在编译时使用 “-static” 选项,即使用静态数组,来避免堆栈大小 对数组的限制。

2.4  MPI 程序的运行

mpirun -np 进程数 可执行程序名

3  OpenMP 程序的编译、链接与运行

3.1  编译开关

编译、链接 OpenMP 并行程序时应该使用 -mp 开关。

3.2  自动生成并行程序

f90 -apo myprogram.f90 可自动生成 OpenMP 程序,但效率一般不高。

3.3  OpenMP 程序的运行

OpenMP 程序需通过环境变量 OMP_NUM_THREADS 指定运行时的线程数,如:

env OMP_NUM_THREADS=4 your_openmp_program

将使用 4 个线程运行。

4  链接 BLAS 库

cc filename.c -lscs

f77 filename.f -lblas

5  作业调度系统

为了保证实验室 SGI Origin O3800 系统的高效运行,我们采用 OpenPBS 对用户作业进行调度。系统中的 64 个 CPU 被划分为两部分。第一部分 做为 boot 分区 (boot cpuset),包括 4 个 CPU (0-3),用于运行 系统进程及供用户调试程序。第二部分包括 60 个 CPU (CPU 4-63), 用于运行 OpenPBS 作业。

我们对 OpenPBS 系统进行了特殊配置,使得它自动为每个作业创建一个私有的 cpuset,其中的 CPU、内存资源由该作业独享。为了方便作业在私有 cpuset 中运行程序,我们提供了一条命令 "RUN"。RUN 命令只能用 在作业中,它在作业私有的 cpuset 上运行指定的程序,并且为程序 设定环境变量 OMP_NUM_THREADSPBS_NCPUSPBS_CPUSET 的值,其中 OMP_NUM_THREADSPBS_NCPUS 等于分配给作业的 CPU 数, 而 PBS_CPUSET 则为作业私有 cpuset 的名称。

注意:
  1. 在提交作业时,一定要指定所需要的内存量和 CPU 时间。 当不指定它们时,缺省值为 1GB 内存和 24 小时 CPU。一个并行程序所需要的内存量 和 CPU 时间分别为所有进程或线程的内存量之和和 CPU 时间之和。当程序实际使用 的内存或 CPU 时间超过指定值时作业将会自动被杀掉。

  2. 一定要严格按下面介绍的方法提交作业及运行程序才能保证 程序在所分配的 CPU 上运行,否则的话程序可能会运行在 boot 分区,所有在 boot 分区运行的用户程序当运行时间 (CPU 时间) 超过 15 分钟后会被自动杀掉。

5.1  作业的提交

在 O3800 上提交作业可以用两种方式进行。 第一种方式是使用我们编写的类 LSF 命令 `bsub' 来提交。 第二种方式是编写一个作业脚本然后用 qsub 命令提交。 第一种方式的好处是不需要编写作业脚本,并且与实验室其它集群系统 上的使用方法类似。因此除非有 bsub 命令无法满足的特别要求, 我们鼓励用户使用 bsub 命令来提交自己的作业。下面分别介绍。

5.1.1  通过 bsub 命令提交作业

bsub 是为了方便用户提交作业由我们自行编制的一个 bash 脚本。 它的工作方式与 LSF 的 bsub 命令类似,用户无须编写作业脚本,直接 给出要执行的命令即可。用 "bsub -h" 可以得到一个简单使用说明。 以下给出两个作业提交的例子:

  bsub -np 4 -M 4gb -c 48:0:0 "myprog <input >output 2>&1"
  bsub -np 4 -M 4gb -c 48:0:0 "mpirun prog"

上述第一条命令提交一个串行或 OpenMP 作业,而第二条命令则提交一个 MPI 作业。两个作业均要求 4 个 CPU ("-np 4")、4GB 内存 ("-M 4gb") 和 48 小时 CPU 时间 ("-c 48:00:00")。

说明:

  1. bsub 根据命令行参数自动为用户创建 PBS 作业脚本。

  2. bsub 提交的作业中,用户命令自动通过 RUN 来执行。

  3. bsub 在运行用户命令之前,自动将 OMP_NUM_THREADS 设成 分配给该作业的 CPU 数,因此用户在运行 OpenMP 程序时不必再指定线程数, 除非想使用不同于 CPU 数的线程数。

  4. bsub 提交的命令中 MPI 程序必须用 mpirunmpijob 运行,但可以省略 -np 参数 (省略时将自动使用 分配给作业的处理器数)。

  5. bsub 提交的作业将输出 (标准输出和标准错误) 写在文件 PBS_JOB.作业号 中,作业结束后该文件的内容将通过 email 发送 给用户。如果作业非正常结束,或是被 qdel 命令删除,则 输出可能不能通过 email 发送给用户,此时可从该文件得到作业运行的 结果。

5.1.2  通过作业脚本提交作业

只用 bsub 命令提交作业而无意了解 PBS 作业系统细节的用户 可以跳过本节内容。 关于作业脚本的详细资料可参看 http://lsec.cc.ac.cn/chinese/lsec/doc/v2.3_admin.pdf

通过作业脚本提交作业的步骤为:

  1. 编制一个作业脚本

    假定你想运行位于当前目录下的程序 a.out。 这个程序需要 20MB 内存,运行 10 个小时。根据程序的不同的性质, 可以编写如下所示的作业脚本文件 test.pbs

    1. 串行程序


      #!/bin/tcsh
      #PBS -l ncpus=1,mem=20mb,cput=10:00:00
      #PBS -m abe
      if ( $?PBS_CPUSET == 0 ) then
          exec /usr/bin/RUN $0 $*
      endif
      cd $PBS_O_WORKDIR
      
      # 请根据情况修改上面文件头中第二行的内容,保持其它行内容不变。
      # 下面是用户命令,可使用任意合法的 tcsh 命令。
      ./a.out
      


      注意该脚本开头用 RUN 命令重新运行自己,使得后续命令自动在 作业私有的 cpuset 上运行。

    2. OpenMP 程序


      #!/bin/tcsh
      #PBS -l ncpus=1,mem=20mb,cput=10:00:00
      #PBS -m abe
      if ( $?PBS_CPUSET == 0 ) then
          exec /usr/bin/RUN $0 $*
      endif
      cd $PBS_O_WORKDIR
      
      # 上面文件头中,请根据需要修改第二行的内容,保持其它行不变。
      # 下面是用户命令,可使用任意合法的 tcsh 命令。
      env OMP_NUM_THREADS=$PBS_NCPUS ./a.out
      


      注:RUN 命令会将 OMP_NUM_THREADS 设为分配给作业的 CPU 数,因此运行 OpenMP 程序时如果使用全部 CPU 的话可以不指定 OMP_NUM_THREADS,前题是 .cshrc.profile 等文件中没有设定 OMP_NUM_THREADS。保险的 写法是如上例所示使用变量 PBS_NCPUS

    3. MPI 程序


      #!/bin/tcsh
      #PBS -l ncpus=4,mem=20mb,cput=10:00:00
      #PBS -m abe
      if ( $?PBS_CPUSET == 0 ) then
          exec /usr/bin/RUN $0 $*
      endif
      cd $PBS_O_WORKDIR
      
      # 上面文件头中,请根据需要修改第二行的内容,保持其它行不变。
      # 下面是用户命令,可使用任意合法的 tcsh 命令。
      mpirun -np $PBS_NCPUS ./a.out
      


    注意一定要在作业脚本 (第二行) 中指定程序运行所需要的最大内存量及 CPU 时间。 不指定 CPU 时间时,CPU 时间将被限定为 24 小时 (24:00:00)。 不指定内存时,内存将被限定为 1GB。

  2. 提交作业

    在提示符下敲入命令 qsub test.pbs。系统将会返回一个类似于 104.o3800.cc.ac.cn 的消息,其中 104 代表刚刚提交的作业的作业号。

通过作业脚本提交的作业,其输出信息自动保存在前缀与脚本文件相同的文件中。 在上面的例子中,输出文件名为 test.pbs.o104 (标准输出) 和 test.pbs.e104 (标准错误)。其它信息,如作业开始运行、作业结束等, 则通过 email 通知用户。

5.2  作业监控与管理命令

bjobs
类 LSF 命令,用于显示作业信息,包括运行作业的 CPU。 用 bjobs -h 可显示一个简单使用说明。
bkill
类 LSF 命令,用于删除一个正在运行的作业。 如果想删除一个用 bsub 命令递交的作业的话,建议尽量用该命令删除。 一个尚未开始运行的作业不能用该命令删除,而必须用 OpenPBS 的 qdel 命令删除。
lsload
类 LSF 命令,用于显示所有 CPU 的负载、状态。
qstat
OpenPBS 命令,用于显示作业信息。
showq
Maui 命令,用于显示作业及队列信息。
qdel
OpenPBS 命令,用于删除作业。普通用户只能删除自己的作业。

6  在线文档

O3800 上有许多在线文档,网址为: http://o3800.cc.ac.cn/infosearch。 联接后通过关键字查找感兴趣的内容即可。

本文档的 PDF 版本可从 http://lsec.cc.ac.cn/chinese/lsec/doc/o3800.pdf 下载。

Last modified: Friday, September 23rd, 2005
HTML conversion by TeX2page 2003-06-05