Skip to content

Commit

Permalink
Update SLURM gres options
Browse files Browse the repository at this point in the history
  • Loading branch information
Harry-Chen authored Oct 24, 2023
1 parent 78fd03b commit 71903ce
Show file tree
Hide file tree
Showing 4 changed files with 15 additions and 12 deletions.
2 changes: 1 addition & 1 deletion docs/assignments/4.cuda0.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ cd ~/exp4/
```bash
spack load cuda
make
srun -p gpu --exclusive ./run_cuda
srun --gpus 1 --exclusive ./run_cuda
```

程序完成的任务为:给定高宽为 `H+2``W+2` 的数组 `input`,对于其上每个点,计算它与它右边,下边,右下共计9个点计算后的和,得到高宽为 `H``W`的数组 `output`,计算如下图所示。
Expand Down
7 changes: 5 additions & 2 deletions docs/cluster.md
Original file line number Diff line number Diff line change
Expand Up @@ -113,15 +113,18 @@ source /opt/intel/oneapi/advisor/latest/env/vars.sh # 仅加载 advisor
srun -N 4 -n 8 --cpu-bind sockets ./test --args
```

上述命令表示占用全部 4 个节点,共运行 8 个进程(每机 2 进程),并将每个进程绑定到一个 CPU socket(即一个 NUMA 节点)。通常来说,只需要关注 `-N``-n` 选项,用来控制进程数量;在一些负载上(尤其是 memory bound 程序),[进程绑定](faq/binding.md) 可能 **对性能有较大影响**,需要仔细调节。

为了提高作业运行效率,实验集群的 SLURM 默认工作在**非独占模式**下。如果需要独占节点,需要添加参数 ``--exclusive``,此时每个任务的 **最小分配粒度** 为单个节点。在助教测试时,所有的任务都会独占节点运行,以防互相干扰。

由于机器数量有限,任务可能不会立刻被执行,此时 SLURM 会给出类似下面的提示,请耐心等待:

```text
srun: job 271 queued and waiting for resources
```

集群根据硬件配置分为分为两个队列:`conv` 队列包含所有机器(默认使用),`gpu` 队列只包含有 GPU 的机器。在提交任务时,可使用 `srun -p name` 来指定队列
集群只有一个名为 `conv` 的队列,默认不能使用 GPU。如果需要 GPU 则需要添加参数:`--gpus M`,其中 `M` 为总 GPU 数量。更详尽的用法请参见 [Generic Resource (GRES) Scheduling](https://slurm.schedmd.com/gres.html)

为了防止不同同学的进程互相干扰,实验集群的 SLURM 被配置为独占模式,即每个任务的 **最小分配粒度** 为单个节点。上述命令表示占用全部 4 个节点,共运行 8 个进程(每机 2 进程),并将每个进程绑定到一个 CPU socket(即一个 NUMA 节点)。通常来说,只需要关注 `-N``-n` 选项,用来控制进程数量;在一些负载上(尤其是 memory bound 程序),[进程绑定](faq/binding.md) 可能 **对性能有较大影响**,需要仔细调节。

`sbatch` 用于提交一个非交互式的运行脚本,适用于时间较长的或多个任务的提交。本文档中不详细介绍这一命令的用法,有需要的同学可以查看 [此教程](http://hpc.pku.edu.cn/_book/guide/slurm/sbatch.html)。在此脚本中,需要显式地加载 Spack、使用 Spack 加载依赖软件后,方可正常执行程序。使用 `sbatch``srun` 提交的任务都可以用 `scancel` 命令进行取消或终止。

Expand Down
2 changes: 1 addition & 1 deletion docs/exp/2.apsp.md
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ cd ~/PA2/

1. 加载 CUDA 环境:`spack load cuda`
2. 编译:`make`
3. 运行 `srun -p gpu -N 1 ./benchmark <图规模>` 以运行你的程序。其中 `<图规模>` 为一个整数,表示图中的点数。程序会打印结果是否正确及运行时间两项数据。
3. 运行 `srun -gpus 1 -N 1 ./benchmark <图规模>` 以运行你的程序。其中 `<图规模>` 为一个整数,表示图中的点数。程序会打印结果是否正确及运行时间两项数据。

## 分数细则

Expand Down
16 changes: 8 additions & 8 deletions docs/exp/3.spmm.md
Original file line number Diff line number Diff line change
Expand Up @@ -84,23 +84,23 @@ cd build
cmake ..
make -j4
# 运行单个数据点
srun -p gpu ./test/unit_tests --dataset <datasetname> --len 32 --datadir ~/PA3/data/ # 所有的数据集在 ~/PA3/data/ 中
srun -gpus 1 ./test/unit_tests --dataset <datasetname> --len 32 --datadir ~/PA3/data/ # 所有的数据集在 ~/PA3/data/ 中
# 运行全部 GPU 数据点
srun -p gpu ~/PA3/scripts/run_all.sh # 在 PA3/scripts 目录下
srun -gpus 1 ~/PA3/scripts/run_all.sh # 在 PA3/scripts 目录下
# 运行全部 CPU 数据点
srun -p gpu ~/PA3/scripts/run_all_CPU.sh # 在 PA3/scripts 目录下
srun -gpus 1 ~/PA3/scripts/run_all_CPU.sh # 在 PA3/scripts 目录下
# 改变环境变量,仅仅运行单个测试,例如验证正确性(Validation)
GTEST_FILTER="SpMMTest.validation" srun -p gpu ./test/unit_tests --dataset <datasetname> --len 32 --datadir ~/PA3/data/
GTEST_FILTER="SpMMTest.validation" srun --gpus 1 ./test/unit_tests --dataset <datasetname> --len 32 --datadir ~/PA3/data/
# 例如只运行 CPU 的相关测试
GTEST_FILTER="SpMMCPUTest.*" srun -p gpu ./test/unit_tests --dataset <datasetname> --len 32 --datadir ~/PA3/data/
GTEST_FILTER="SpMMCPUTest.*" srun --gpus 1 ./test/unit_tests --dataset <datasetname> --len 32 --datadir ~/PA3/data/
```

其中 `dataset` 包含许多真实图数据(稀疏矩阵),稀疏矩阵的形状($M$,在代码中是 `kNumV`)和非零元($nnz$,在代码中是 `kNumE`)也被其决定。例如对于图数据 `a`,我们有两个文件,`a.config` 在同一行内存储了 $M$ 和 $nnz$,`a.graph` 第一行存储了 `PTR` 数组,第二行存储了 `IDX` 数组,`VAL` 数组在运行时随机初始化。

`--len` 决定了 $B$ 和 $C$ 的 $K$。数据在 `PA3/data` 中。可以自己造一个小的数据集来 debug,如下:

```bash
srun -p gpu ./test/unit_tests --dataset toy_graph --len 32 --datadir /path/to/your/data
srun -gpus 1 ./test/unit_tests --dataset toy_graph --len 32 --datadir /path/to/your/data
```

在测试时会测试 `len = 32, 256` 的情况。
Expand Down Expand Up @@ -129,9 +129,9 @@ srun -p gpu ./test/unit_tests --dataset toy_graph --len 32 --datadir /path/to/yo

```bash
# 得到程序运行的总结,包括整个程序运行过程中,各个 kernel 以及 CUDA API 的执行时间和次数
srun -p gpu nvprof ./test/unit_tests xxxxxxxxxx
srun --gpus 1 nvprof ./test/unit_tests xxxxxxxxxx
# profile 单个 kernel 的执行情况,通过 --kernels 指定要 profile 的 kernel 的名称;通过 --metrics 指定要 profile 的是什么 metric,如 dram_read_bytes, achieved_occupancy 等,也可以指定为 all 来得到所有的 metric
srun -p gpu nvprof --kernels "KERNEL1|KERNEL2" --metrics "METRIC1|METRIC2" ./test/unit_tests xxxxxxxxxx
srun --gpus 1 nvprof --kernels "KERNEL1|KERNEL2" --metrics "METRIC1|METRIC2" ./test/unit_tests xxxxxxxxxx
```

关于可以 profile 得到的性能指标以及 `nvprof` 更高级的使用方法可以参考 <https://docs.nvidia.com/cuda/profiler-users-guide/index.html>
Expand Down

0 comments on commit 71903ce

Please sign in to comment.