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 下载。