多线程程序提交
我们介绍一个多进程程版本的 hello world 程序的并行提交方式。
# 准备工作
- 登录超算系统系统,并切换到相应的工作目录。
- 编写并编译多进程版本的 hello world 程序,并将可执行文件 a.out 放到工作目录。
# hello world 程序
编写一个文本文件 hello-mpi.c,内容如下:
#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
int main(int argc, char** argv) {
int rank, size;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
printf("Hello, world! Process %d of %d\n", rank, size);
MPI_Finalize();
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# 编译 hello world 程序
gcc hello-mpi.c -o a.out
1
# 提交作业
假设用户可执行文件为 a.out,编写提交脚本 sub.sh 如下:
#!/bin/bash
#SBATCH -n 4 -p debug
yhrun a.out
1
2
3
2
3
提交批处理命令如下:
yhbatch sub.sh
1
参数说明:
1、yhrun a.out
,没写进程数,默认使用 yhbatch 的设置,即为 #SBATCH -n 4
,所以并行进程数为 4 个。
修改
示例中的 -p debug
参数,请根据实际情况进行计算分区名称的调整
注意
- 多进程程序使用 MPI 进行消息通信,因此可以实现跨计算节点计算。
- 因此运行 MPI 程序时建议优先用满计算节点的所有 CPU 核,以便充分利用计算资源。
# 运行结果
如果作业正常运行结束,会生成一个 slurm-xxxx.out 文件,内容如下:
Hello, world! Process 1 of 4
Hello, world! Process 2 of 4
Hello, world! Process 3 of 4
Hello, world! Process 0 of 4
1
2
3
4
2
3
4
说明:
- 因为设置了线程数为 4,所以结果有四行
- 但是由于 print 函数由四个进程(无序)执行,因此结果顺序是随机的。
# MPI程序(用户自编MPI)
如果用户自行编译MPI并且没有支持slurm作业调度系统接口,那么在提交并行任务时,只能使用 mpirun
命令运行。举例如下:
如果用户需要使用请自行安装。假设用户 A 在个人目录下安装了 openmpi,使用 /vol6/home/A/openmpi
编译生成可执行程序 a.out,则编写脚本 sub.sh 如下:
#!/bin/bash
yhrun -n $SLURM_NPROCS -p debug /bin/hostname > hostlist
/vol6/home/A/openmpi/bin/mpirun -np $SLURM_NPROCS -hostfile hostlist ./a.out
1
2
3
2
3
用户根据该脚本,提交批处理命令如下:
yhbatch -n 24 -p debug ./sub.sh
1