137 lines
5.3 KiB
Markdown
137 lines
5.3 KiB
Markdown
# 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 <stdio.h>
|
||
#include <string.h>
|
||
#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)
|
||
|