Last modified: September 23, 2005
这是由几位用户整理的实验室 SGI Origin 3800 并行机的简单使用说明。欢迎大家 共同对它进行改进、完善。
本文档的 PDF 版本位于: http://lsec.cc.ac.cn/chinese/lsec/doc/o3800.pdf。
2 MPI 程序的编译、链接与运行
2.1 编译与链接
2.2 优化编译可选项
2.3 大数组程序
2.4 MPI 程序的运行
3 OpenMP 程序的编译、链接与运行
3.1 编译开关
3.2 自动生成并行程序
3.3 OpenMP 程序的运行
5 作业调度系统
5.1 作业的提交
5.1.1 通过 bsub 命令提交作业
5.1.2 通过作业脚本提交作业
5.2 作业监控与管理命令
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/。
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
几个基本优化选项:-O0
, -O1
, -O2
, -O3
,
-Ofast
。
用 f90 -O1 myprogram.f90 -lmpi
和 f90 -Ofast myprogram.f90
两种方法编译速度相差很大,可达 5 倍以上。但是 -Ofast
对程序的通用性要求较高,一些老的 Fortran 可能编译通
不过。一个比较有效的编译可与其他编译选项结合使用。
其它优化可参看 O3800 上的 man page (如用命令 man f90
可显示
Fortran 90 编译器的使用说明)。或阅读 O3800 的在线文档
(http://o3800.cc.ac.cn/infosearch)。
系统缺省的堆栈大小是 65536KB, 因此有些大数组程序无法直接运行, 用命令 “limit stacksize unlimited” 可以扩大堆栈空间至 524288KB。
也可以在编译时使用 “-static” 选项,即使用静态数组,来避免堆栈大小 对数组的限制。
mpirun -np 进程数 可执行程序名
编译、链接 OpenMP 并行程序时应该使用 -mp
开关。
f90 -apo myprogram.f90
可自动生成 OpenMP 程序,但效率一般不高。
OpenMP 程序需通过环境变量 OMP_NUM_THREADS
指定运行时的线程数,如:
env OMP_NUM_THREADS=4 your_openmp_program
将使用 4 个线程运行。
cc filename.c -lscs
或
f77 filename.f -lblas
为了保证实验室 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_THREADS
、PBS_NCPUS
和
PBS_CPUSET
的值,其中 OMP_NUM_THREADS
和 PBS_NCPUS
等于分配给作业的 CPU 数,
而 PBS_CPUSET
则为作业私有 cpuset 的名称。
注意:
在提交作业时,一定要指定所需要的内存量和 CPU 时间。 当不指定它们时,缺省值为 1GB 内存和 24 小时 CPU。一个并行程序所需要的内存量 和 CPU 时间分别为所有进程或线程的内存量之和和 CPU 时间之和。当程序实际使用 的内存或 CPU 时间超过指定值时作业将会自动被杀掉。
一定要严格按下面介绍的方法提交作业及运行程序才能保证
程序在所分配的 CPU 上运行,否则的话程序可能会运行在 boot
分区,所有在 boot
分区运行的用户程序当运行时间 (CPU 时间)
超过 15 分钟后会被自动杀掉。
在 O3800 上提交作业可以用两种方式进行。
第一种方式是使用我们编写的类 LSF 命令 `bsub
' 来提交。
第二种方式是编写一个作业脚本然后用 qsub
命令提交。
第一种方式的好处是不需要编写作业脚本,并且与实验室其它集群系统
上的使用方法类似。因此除非有 bsub
命令无法满足的特别要求,
我们鼓励用户使用 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
")。
说明:
bsub
根据命令行参数自动为用户创建 PBS 作业脚本。
bsub
提交的作业中,用户命令自动通过 RUN
来执行。
bsub
在运行用户命令之前,自动将 OMP_NUM_THREADS
设成
分配给该作业的 CPU 数,因此用户在运行 OpenMP 程序时不必再指定线程数,
除非想使用不同于 CPU 数的线程数。
用 bsub
提交的命令中 MPI 程序必须用 mpirun
或
mpijob
运行,但可以省略 -np
参数 (省略时将自动使用
分配给作业的处理器数)。
用 bsub
提交的作业将输出 (标准输出和标准错误) 写在文件
PBS_JOB.作业号
中,作业结束后该文件的内容将通过 email 发送
给用户。如果作业非正常结束,或是被 qdel
命令删除,则
输出可能不能通过 email 发送给用户,此时可从该文件得到作业运行的
结果。
只用 bsub
命令提交作业而无意了解 PBS 作业系统细节的用户
可以跳过本节内容。
关于作业脚本的详细资料可参看
http://lsec.cc.ac.cn/chinese/lsec/doc/v2.3_admin.pdf。
通过作业脚本提交作业的步骤为:
编制一个作业脚本
假定你想运行位于当前目录下的程序 a.out
。
这个程序需要 20MB 内存,运行 10 个小时。根据程序的不同的性质,
可以编写如下所示的作业脚本文件 test.pbs
。
串行程序
#!/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 上运行。
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
。
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。
提交作业
在提示符下敲入命令 qsub test.pbs
。系统将会返回一个类似于
104.o3800.cc.ac.cn
的消息,其中 104
代表刚刚提交的作业的作业号。
通过作业脚本提交的作业,其输出信息自动保存在前缀与脚本文件相同的文件中。
在上面的例子中,输出文件名为 test.pbs.o104
(标准输出) 和
test.pbs.e104
(标准错误)。其它信息,如作业开始运行、作业结束等,
则通过 email 通知用户。
bjobs -h
可显示一个简单使用说明。
bsub
命令递交的作业的话,建议尽量用该命令删除。
一个尚未开始运行的作业不能用该命令删除,而必须用 OpenPBS 的
qdel
命令删除。
O3800 上有许多在线文档,网址为: http://o3800.cc.ac.cn/infosearch。 联接后通过关键字查找感兴趣的内容即可。
本文档的 PDF 版本可从 http://lsec.cc.ac.cn/chinese/lsec/doc/o3800.pdf 下载。