2. 仿真任务建模与调度需求分析
调度器要做出“先跑谁、放哪跑、跑多久”的判断,前提是先把仿真作业从“一个待执行的命令行”抽象成可计算的对象。这一步通常称为仿真任务建模:把作业拆成有依赖关系的计算单元,为每个单元标注资源需求、优先级和截止时间,再据此推导出调度需求。建模质量直接决定调度策略能否落地——模型里没有的信息,调度器不可能凭空推断出来。
一、任务图:把作业拆成可调度的计算单元
仿真作业很少是单一进程。以 CFD 为例,一次瞬态计算可能包含网格分区、并行求解、后处理三个阶段,其中并行求解又依赖网格分区产物。这类结构适合用有向无环图(DAG)表示:节点是任务单元,边是数据依赖或执行顺序约束。
任务图建模需要明确三件事:节点粒度、依赖类型和边上的数据量。节点粒度决定调度灵活性——粒度过粗(整个作业当一个任务)会浪费并行机会,粒度过细(每个时间步一个任务)会带来巨大调度开销。工程上常以“一次可独立提交的 MPI 作业”为节点,例如把 1000 万网格的 CFD 算例切成 8 个分区,每个分区求解作为一个节点。依赖类型分为顺序依赖(B 必须在 A 完成后开始)和数据依赖(B 需要 A 的输出文件),后者往往还隐含数据传输代价。边上的数据量用于估算通信开销,例如分区交界面的场数据交换量。
图中每个节点都标注了资源需求(节点数、核数)和预估运行时长。这些数值来自历史作业统计或基准测试,属于建模阶段的输入参数。关键路径决定了作业的最短完成时间,调度器应优先保障关键路径上的任务获得资源。
二、资源需求模型:不只是“要多少核”
把资源需求简化为“核数”会丢失大量调度信息。一个可用的资源需求模型至少应包含以下维度:
- 计算资源:CPU 核数、是否需要 GPU、每核内存上限。分子动力学中 GPU 加速的短程力计算与 CPU 上的 PME 长程力计算往往需要按比例分配。
- 内存:峰值内存而非平均内存。FEA 隐式求解的刚度矩阵装配阶段内存占用可能是求解阶段的数倍。
- 存储 I/O:临时文件读写量、检查点写入频率。CFD 每 100 步写一次检查点,若 I/O 带宽不足会拖慢整个作业。
- 网络:MPI 集合通信的规模。跨节点通信对 InfiniBand 拓扑敏感,调度时需尽量把同一作业的分区放在同一交换机域内。
- 许可证:商业求解器(如 Fluent、Abaqus)的 license token 数量是硬约束,token 不足时作业只能排队。
这些维度共同构成资源向量 R = (cpu, gpu, mem, io, net, license)。调度器在分配节点时,需要保证目标节点集合的可用资源在每个维度上都不小于 R。工程上常用“资源预留 + 超配检测”的方式:先按 CPU 和内存做初筛,再检查 GPU 和 license 是否满足。
三、优先级与截止时间约束
优先级和截止时间共同决定作业的紧急程度。优先级通常由用户角色、项目阶段或作业类型决定,例如交互式调试作业优先级高于批量生产作业。截止时间则来自项目里程碑或会议节点。
把两者结合,可以用松弛时间来量化紧迫度:
松弛时间 = 截止时间 - 当前时间 - 预估剩余运行时长
若松弛时间 < 0:作业已无法在截止时间前完成,需告警或降级
若松弛时间 < 阈值(如 2 小时):进入紧急队列,优先分配资源
若松弛时间 > 阈值:正常排队,可被抢占
调度器据此实现分级策略:紧急作业可抢占低优先级作业的资源,被抢占的作业保存检查点后重新排队。这里的关键是检查点机制——没有检查点的作业被抢占后只能从头重算,代价过高,因此通常不允许被抢占。
四、典型仿真场景的调度需求差异
不同仿真类型的计算特征差异很大,调度需求也各不相同。下表对比三类典型场景:
| 场景 | 并行特征 | 资源瓶颈 | 调度关键需求 |
|---|---|---|---|
| CFD | MPI 域分解,分区数固定,通信频繁 | 网络带宽、内存带宽 | 分区同交换机域放置;避免与 I/O 密集作业混跑 |
| FEA | 稀疏矩阵求解,内存随规模超线性增长 | 内存容量、license token | 按峰值内存预留;token 池统一管理,防止死锁 |
| 分子动力学 | GPU 加速短程力 + CPU 长程力,异构 | GPU 显存、GPU-CPU 传输 | GPU 与 CPU 按比例绑定;显存不足时拒绝启动 |
以分子动力学为例,一个典型 GROMACS 作业可能请求 1 块 GPU 加 8 个 CPU 核,其中 GPU 负责短程非键相互作用,CPU 负责 PME 和约束算法。调度器需要把 GPU 和 CPU 作为绑定资源一起分配,不能出现“分到 GPU 但 CPU 被其他作业占满”的情况。这要求资源模型支持组合资源语义。
完成建模后,调度器面对的不再是模糊的“一个仿真作业”,而是一组带有依赖、资源向量和紧迫度标签的任务单元。后续的队列管理、回填、抢占和拓扑感知分配,都建立在这一模型之上。