多线程程序提交
我们介绍一个多线程版本的 hello world 程序的并行提交方式。
# 准备工作
- 登录超算系统系统,并切换到相应的工作目录。
- 编写并编译多线程版本的 hello world 程序,并将可执行文件 a.out 放到工作目录。
# hello world 程序
编写一个文本文件 hello-omp.c,内容如下:
#include <stdio.h>
#include <omp.h>
int main() {
#pragma omp parallel
{
printf("Hello, world! Thread %d\n", omp_get_thread_num());
}
return 0;
}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 编译 hello world 程序
gcc -fopenmp hello-omp.c -o a.out
1
# 提交作业
假设用户可执行文件为 a.out,编写提交脚本 sub.sh 如下:
#!/bin/bash
#SBATCH -n 1 -p debug
export OMP_NUM_THREADS=4
yhrun a.out
1
2
3
4
2
3
4
提交批处理命令如下:
yhbatch sub.sh
1
参数说明:
1、export OMP_NUM_THREADS=4
用户设置并行线程数为 4。
2、yhrun a.out
运行可执行文件 a.out,使用的 -N -n 的值,由 yhbatch 命令自动设置。
3、我们将任务需要的参数,写入了提交脚本,并通过 yhbatch
命令提交。
修改
示例中的 -p debug
参数,请根据实际情况进行计算分区名称的调整
注意
- 单纯的多线程程序无法实现跨节点计算,因此可以设置较大的并行线程数以便充分利用计算资源。
- 但是如果并行线程数过大,可能会由于并行程序的并行度不够或者程序存在资源竞争、原子操作导致性能地下,甚至程序设计不合理产生死锁等问题导致运行失败。因此,需要根据实际情况设置并行线程数。
# 运行结果
如果作业正常运行结束,会生成一个 slurm-xxxx.out 文件,内容如下:
Hello, world! Thread 1
Hello, world! Thread 2
Hello, world! Thread 3
Hello, world! Thread 0
1
2
3
4
2
3
4
说明:
- 因为设置了线程数为 4,所以结果有四行
- 但是由于 print 函数由四个线程(无序)执行,因此结果顺序是随机的。