# torque 简介 > PBS, Portable Batch System, 可执行程序的批处理系统,用来在计算机上做任务管理。主要有三个分支: > > - [openpbs](https://github.com/openpbs/openpbs)(开源) 早期的pbs系统,失去维护, 2016年后由PBS Pro接手,升级为[pbs pro opensource project](https://www.pbspro.org),目前更新频繁 > - [Torque](https://github.com/adaptivecomputing/torque)(开源) openpbs的分支,由adaptivecomputing接手后持续更新,于2016年前停止更新 > - PBS Pro(商业) openpbs的商业版本 > > torque 是一个分布式作业管理系统, PBS 分支之一, 可以在超算或集群上管理多个任务队列,每个队列关联特定的资源,比如a队列任务是写入日志,b队列任务是备份或者压缩日志,a队列随时响应, b队列每天提交一次任务等,每个队列有不同的特性需要不同的资源,torque就是在集群中分配管理这些资源,比如将任务a1分配到哪个节点执行,限制多少核数,限制多少内存,限制最多多长时间执行等。 ## [torque 指令](http://docs.adaptivecomputing.com/torque/4-0-2/help.htm#topics/12-appendices/commandsOverview.htm) - [qsub](http://docs.adaptivecomputing.com/torque/4-0-2/help.htm#topics/commands/qsub.htm) 提交任务 ```bash # 形如 qsub -n task_name -o output_path -q queue1_name -a date_time -l ncpus=16,mem=1024mb job.script ``` | -n | 任务名 | | ---- | --------------------------------------------------- | | -o | 任务输出地址 | | -q | 任务队列名称 | | -a | 在什么时间之后执行 | | -r | 该任务是否可以重新执行 | | -u | -u user@host,user@host 定义可以执行的用户 | | -v | 定义任务执行的环境变量, -v var1=value1,var2=value2 | | -l | 定义硬件资源限制,-l ncpus=16,mem=1024mb | | -d | 任务执行路径 | - qstat 查看任务状态 - qdel 删除或终止任务 - qhold 保留某任务,暂时不去执行 - qrls 释放某任务到等待执行状态 ## PBS 脚本语法 一个 pbs 任务脚本 类似这样 ```bash #!/bin/bash #PBS -k o #PBS -l nodes=2:ppn=6,walltime=30:00 #PBS -M jthutt@tatooine.net #PBS -m abe #PBS -N JobName #PBS -j oe mpiexec -np 12 -machinefile $PBS_NODEFILE ~/bin/binaryname ``` 第一行指明用bash去执行该脚本, 后面几行声明一些任务参数,跟qsub指令参数一样。 最后一行就是真的的任务, 告诉系统用 mpiexec 这个指令在这些计算节点 $PBS_NODEFILE 上去执行 ~/bin/binaryname 这个命令 ## MPI MPI是一个跨语言的通讯协议,基于此可用于编写并行计算程序。 mpi 有6个基本接口 | MPI_Init | 初始化,其后面到MPI_Finalize为止的代码在每个进程中都会执行一遍 | | ------------- | ------------------------------------------------------------ | | MPI_Comm_size | 获得进程个数n | | MPI_Comm_rank | 获得本进程的id, 从0到n-1 | | MPI_Send | 发送消息 | | MPI_Recv | 收到消息 | | MPI_Finalize | mpi 退出, 必须调用 | ```c++ // 示例 mpitest // 0号进程接收消息 并 打印 // 非0号进程发送消息 #include #include #include "mpi.h" void main(int argc, char* argv[]) { int numprocs, myid, source; MPI_Status status; char message[100]; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &myid); MPI_Comm_size(MPI_COMM_WORLD, &numprocs); if (myid != 0) { //非0号进程发送消息 strcpy(message, "Hello World!"); MPI_Send(message, strlen(message) + 1, MPI_CHAR, 0, 99, MPI_COMM_WORLD); } else { // myid == 0,即0号进程接收消息 for (source = 1; source < numprocs; source++) { MPI_Recv(message, 100, MPI_CHAR, source, 99, MPI_COMM_WORLD, &status); printf("接收到第%d号进程发送的消息:%s\n", source, message); } } MPI_Finalize(); } ``` ```bash # mpitest 为上面文件编译后的可执行文件 # 通过调用mpiexec 开4个进程同时运行mpitest mpiexec -np 4 mpitest # 输出 接收到第1号进程发送的消息:Hello World! 接收到第2号进程发送的消息:Hello World! 接收到第3号进程发送的消息:Hello World! ``` ### 参考 - https://en.wikipedia.org/wiki/Portable_Batch_System - https://en.wikipedia.org/wiki/TORQUE - https://kb.iu.edu/d/avmy - http://docs.adaptivecomputing.com/torque/4-0-2/help.htm#topics/12-appendices/commandsOverview.htm - [CentOS下torque集群配置(一)-torque安装与配置](https://blog.csdn.net/dream_angel_z/article/details/44225669/) - [作业提交系统Torque个人安装总结(PBS)](https://blog.csdn.net/educast/article/details/7166764) - [PBS命令和使用](https://www.cnblogs.com/yqsun/p/5433070.html) - [MPI编程入门详解](https://www.jianshu.com/p/2fd31665e816)