🖇️ 并行运算

在开始此并行任务教程前,请确保你已经完成了 🔑 登录(Login), 🧮 任务提交和结果下载🚩 Slurm命令 等教程。 同时,请下载此并行任务教程需要用到的样板文件到你的电脑:

其中,my_example_parallel_program.py 文件是一个简单的python并行样板程序。我们将在此教程中运行此样板并行程序作为示范。 而上述 my_parallel_job.sh 文件是一个样板并行任务配置文件, 它包含了必要的并行任务信息(如任务的内容、所需的硬件资源、所需最大运行时间、输出结果的路径等等)。 我们将通过提交此样板并行任务配置文件至GigaRiver从而完成并行任务的提交。

同样,在这里我们将只使用python程序进行教程。其他编程语言的并行任务提交方法类似。

🐍 样板并行程序解析

如果你使用任意文本程序查看 my_example_parallel_program.py 文件,你将看到以下内容:

from mpi4py import MPI

COMM = MPI.COMM_WORLD
RANK = COMM.Get_rank()
SIZE = COMM.Get_size()

import socket
hostname = socket.gethostname()

from time import sleep

sleep(10)  # 等待10秒,延长程序运行时间以便于squeue查看任务进度。

for i in range(SIZE):
    if RANK == i:
        print(f"I am rank#{RANK}, I am in node={hostname}")
    else:
        pass
    COMM.barrier()

for i in range(SIZE):
    for j in range(SIZE):
        if i != j:
            if RANK == i:
                COMM.send("Sending message ...", dest=j)
            elif RANK == j:
                msg = COMM.recv(source=i)
                print("mpi between", i, "and", j, "works.", flush=True)
            else:
                pass

它就是一个简单的MPI并行试验程序,用于验证并行任务中多个线程间的沟通是否顺畅。并行编程是提高计算效率的最有效的方法。 我们建议你在具备基础编程能力后尽快转向并行编程的学习。搜索“MPI并行编程”可快速获取大量并行编程教程。

🛡️ 样板并行任务配置文件解析

如果你使用任意文本程序查看 my_parallel_job.py 文件,你将看到以下内容:

#!/bin/bash

#SBATCH --job-name=mpi_test
#SBATCH --partition=P0
#SBATCH --nodes=1
#SBATCH --ntasks=4
#SBATCH --mem=8G
#SBATCH --time=6-23:59:59
#SBATCH --output=output.out
#SBATCH --error=error.err

mpirun python3 my_example_parallel_program.py

我们可以看到,此任务索要1个节点(--nodes=1)里的4个线程(--ntasks=4)作为算力资源。同时,我们要求使用8G的总内存。 为了充分利用这4个线程,在运行代码的部分,我们使用了命令

mpirun python3 my_example_parallel_program.py

这个命令中我们使用了 mpirun, 它将自动同时启动4个进程并在所有进程里调用python3执行 my_example_parallel_program.py 程序。 注意:

  • 如果你代码不是并行程序,上述配置仍然有效。但是,4个进程将独立运行(彼此没有沟通)。那么,你只不过要求系统在同一时间做4次相同的工作。这显然没有任何意义。

  • 一般而言,你只需要使用1个节点。当节点数目大于1时,线程间的沟通将通过交换机来进行。这个沟通速度(受带宽和延迟影响)将远远低于1个节点内线程间的沟通速度(通过CPU内部总线)。造成的直接后果是:线程间沟通时的等待时间甚至会大于计算本身的耗时。所以,除非你非常清楚你在做什么且你的代码具备特殊的跨节点并行优化设计,否则请不要使用大于1个节点(因为往往这反而为会减慢运算速度。)

所以,总结而言,你只需要修改 --ntasks=xx 的值即可实现使用不同数量线程的并行任务。

⚾ 任务上传、提交、结果下载等

这部分内容同普通任务类似,请参考 🧮 任务提交和结果下载 教程。

在成功使用 sbatch 命令执行

$ sbatch my_parallel_job.sh

后,请使用 squeue 监视程序运行状态。在程序运行完成后,查看此次运行生成的 output.out 文件。 你能根据 my_example_parallel_program.py 中的代码解释 output.out 中的内容么?

Important

类似地,请务必通过 sbatch (或 srun)来提交任何并行任务。比如直接在终端运行命令

$ mpirun -n 4 python3 my_parallel_program.py

将在主节点内开启一个4进程的并行运算,对主节点造成巨大负载,对GigaRiver的稳定运行造成极大危害⚡️⚡️⚡️。

接下来,你可以学习提交 🅿️ phyem任务。它可以作为一个普通(串行)任务或者并行任务提交。