准备工作:联系天河二号工作人员,填写申请表,审核通过后获得账号、密码、登录密钥和使用说明手册。
以下是在天河二号运行程序的一些总结,主要参考天河二号官方下发的使用说明。
连接
连接天河二号机器前,需先登录VPN。如果未安装VPN,先进入网页https://vpn3.nscc-gz.cn:4433下载Windows客户端,然后安装并运行程序。在出现的登录界面中填入以下信息:
服务器:vpn1.nscc-gz.cn
端口: 4433
账号: 账号
密码: 密码
如果信息无误,点解登录后VPN客户端会最小化到右下角托盘并显示绿色图标。
登录VPN后,才可以用SSH方式连接到天河二号的登录节点。登录节点默认的认证方式是免密私钥认证,需提供开设账号时分发的私钥作为凭证。使用OpenSSH客户端连接的示例为:
chmod 600 private_key && ssh -i private_key username@172.16.22.11
private_key在windows下默认为755权限,OpenSSH会拒绝使用安全性低的私钥,chmod保证读写权限均为私有。
运行环境
通过一些命令可以探测到天河登录系统的运行环境。
- uname -a: 系统的内核版本是2.6.32
- cat /proc/cpuinfo: 登录节点使用了intel芯片,含4个物理CPU,每个CPU8核心16线程
- free -g: 登录节点配备了128G内存
- df -h: 大约5P的硬盘存储
- gcc -v: gcc版本为4.4.7
- icc -v: 系统默认的icc版本为14.0.2,其他版本需使用module命令加载
- mpicc -v: mpi版本为3.1.3,使用icc 14.0.2编译
- make -v: make版本为3.81
- cat /etc/hosts|grep ln: 系统有几十个登录节点,这也解释为了登录的时候会经常提示指纹不匹配
- module avail: 系统支持模块,高版本的GCC/CUDA/FFT等均可以模块方式加载,无需自行编译
- ping cn.bing.com/ping 114.114.114.114: 提示找不到主机,表明机器无法访问外网
通过查看yhinfo等命令的帮助,可以看到任务管理系统使用的是slurm。把slurm命令中的s替换成yh,则是yh系列的各个命令。
计算节点无法登录,可以通过yhrun执行程序探测。以下是一些计算节点的信息:
CPU: Xeon(R) CPU E5-2692 v2 @ 2.20GHz(未启用超线程) 内存: 64G 操作系统:天河自编译的Linux系统,内核版本2.6.32
程序运行
按照官方指南,程序的源码和编译可在主目录下,运行时的存储应放置在BIGDATA目录中。程序运行的命令主要是yhrun和yhbatch,yhrun是交互式提交作业,yhbatch是批量提交作业。实际使用中建议用yhbatch提交作业。
yhinfo/yhi
通过yhinfo或者yhi可查看用户可用的节点状态。命令的输出中,需要关注的是PARTITION和STATE两列。PARTITION指示任务可提交到的分区,在yhrun中会使用;STATE表示节点状态,只有idle的节点才是可直接使用的。
要查看所有分区/队列信息,可加上-a选项。
yhrun
yhrun用来交互式提交作业。基本用法是: yhrun [options] program [program-options]。options中,常见指定如下选项:
- -n: 任务数。在MPI作业中,即进程数
- -p: 任务运行分区。可用分区通过yhi命令查看
- -N: 节点数。希望作业运行在几个节点上
- -c: 任务使用的核心数。该值默认为1,非openMP程序一般用不到,指定了也不影响运行。
天河二号的每个计算节点配置24核,并且是独占式的。这意味着节点在同一时间只能被一个用户所使用,为了节省结算计时,尽量让N=[n/24],或者不指定-N参数。
yhrun可以替代mpirun使用,而不是简单的在各个主机上执行相同程序。例如在多个进程上运行非MPI程序:yhrun -n20 -p free hostname
,结果将返回进程所在节点的主机名,结果类似于pssh执行同一条命令。通过yhrun运行的程序能否让MPI程序的各个进程正常进行通信和交互,刚开始尚有疑惑。
为了检测yhrun和mpirun有相同效果,写了一个小demo进行校验。以下的测试代码:
#include "mpi.h"
#include <stdio.h>
int main(int argc, char **argv)
{
int rank, size, namelen;
char name[1024];
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Get_processor_name(name, &namelen);
printf("Hello world! I'm %s(%d) of %d/n", name, rank, size);
MPI_Finalize();
return 0;
}
编译和运行:
mpicc -o foo -O2 demo.cpp
yhrun -n20 -p free ./foo
从结果上看,yhrun的执行效果和mpirun一致,说明yhrun确实可以替代mpirun执行有通信的多进程程序。
yhbatch
mpirun是交互式的提交作业,这意味着会一直占据终端,直到程序开始计算并将结果返回回会释放终端。大部分的程序运行时间周期都较长,在等待期间,如果用yhrun,用户只能等待结果或另开连接,否则无法进行其他操作。实际使用中,应使用yhbatch提交作业,yhrun执行具体任务。作业系统在yhbatch提交时申请的资源满足后,调度执行任务并将结果存放到用户的目录下。
yhbatch命令选项和mpirun命令相差不大,猜测的主要不同是yhbatch是向调度中心进行资源申请,只有满足这些条件才运行用户的程序,否则继续等待。
使用yhbatch首先建立一个脚本文件,里面放入程序执行命令:
#!/bin/bash
yhrun -n10 -p free ~/foo
然后使用yhbatch提交:chmod u+x ./batch.sh; yhbatch -n10 -pfree ./batch.sh
。yhbatch中的-N等参数应该不小于yhrun中的参数,否则运行时的进程数和节点可能并非所想,甚至出现资源错误提示。
yhqueue/yhq
yhbatch提交作业后,使用yhqueue/yhq可查看正在运行的任务状况。
yhcancal
提交到任务队列后,yhq可查看提交或者正在运行的任务id。如果想终止任务,使用yhcancel。
其他事项,请参考官方说明手册。