EDA 大规模集群任务调度的“前世今生”:需求、挑战与未来展望
电子设计自动化(EDA)是现代半导体产业的基石,它涵盖了一系列复杂的软件工具,用于设计、验证和制造从微处理器到复杂的系统(SoC)的各种集成电路。随着芯片设计日益复杂,晶体管数量呈指数级增长,EDA工作流程从单一的计算任务演变为需要在数千个计算核心上运行数百万个任务的大规模集群计算问题。

如何高效、可靠地调度这些纷繁复杂的任务,最大限度地利用宝贵的计算资源和昂贵的软件许可,已成为芯片设计公司保持竞争力的核心议题。本文将以图文并茂的方式,深入探讨EDA 大规模集群任务调度的需求、挑战与解决方案,并展望其未来发展趋势。
1.1 典型的 EDA 设计流程与任务依赖

要理解 EDA 任务调度的需求,首先必须了解其典型的工作流程。一个完整的芯片设计流程通常分为前端设计(Front-end)和后端设计(Back-end)两大阶段,每个阶段都包含一系列计算密集型和数据密集型的任务,这些任务之间存在着复杂的依赖关系。
• 静态时序分析 (Static Timing Analysis, STA):在没有输入激励的情况下,分析电路的信号传输延迟,确保其满足时序要求。
-
设计规则检查 (DRC - Design Rule Checking):确保物理版图符合制造厂的工艺规则。 -
版图与原理图对比 (LVS - Layout Versus Schematic):验证物理版图与逻辑综合后的门级网表是否一致。 -
寄生参数提取 (Parasitic Extraction):提取布线后的寄生电阻和电容,并进行更精确的时序和功耗分析。
从上面的描述可以看出,EDA 工作流是一个典型的有向无环图(DAG),任务之间存在着“完成-开始”(Finish-to-Start)的强依赖关系。例如,必须先完成逻辑综合,才能进行布局规划。同时,在功能仿真等阶段,又存在大量可以并行执行的独立任务。这种混合了串行依赖和大规模并行的复杂模式,对任务调度系统提出了第一个核心需求:必须能够理解和处理复杂的任务依赖关系。
因此,调度系统必须具备管理异构资源的能力,能够将不同资源需求的任务精确地匹配到最合适的计算节点上,实现“好钢用在刀刃上”。
在“时间就是金钱”的半导体行业,芯片的上市时间(Time-to-Market)是决定成败的关键因素。设计和验证周期的缩短,意味着可以更快地抢占市场先机。EDA 集群每天需要处理数百万至上千万个任务,调度系统本身必须具备高通量(High Throughput)的处理能力,即在单位时间内能够分派和执行尽可能多的任务。同时,从任务提交到开始执行的延迟(Latency)也必须尽可能低,以确保计算资源能够被迅速利用起来,减少工程师的等待时间,提高研发效率。
如前所述,EDA 工作流的复杂依赖性是其固有挑战。调度器需要能够解析这种依赖关系,确保任务按正确的顺序执行,然而实际情况更为复杂。设计过程是迭代的,工程师会不断修改设计、重新运行验证任务,导致工作负载是高度动态和不可预测的。一个紧急的“ECO”(Engineering Change Order,工程变更指令)可能会引入一系列高优先级的任务,打乱原有的调度计划。如何在这种动态变化的环境中,既能保证任务的正确执行顺序,又能灵活地调整优先级,是调度系统面临的一大难题。
如何打破资源孤岛,实现全局的资源共享和统一调度,并精细化地管理许可证资源,是提升整体资源利用率的关键。
随着设计规模的扩大,EDA 任务产生和需要访问的数据量也呈爆炸式增长。一个全芯片的仿真可能会生成 TB 级别的波形数据。当成千上万个任务同时对共享存储系统进行高并发的读写操作时,很容易造成I/O 瓶颈,导致任务执行速度急剧下降,计算核心长时间处于“饥饿”状态,等待数据加载。传统的基于网络文件系统(NFS)的存储架构,在面对这种极端 I/O 压力时,往往会成为整个系统的性能短板。
随着芯片设计复杂度的持续增加和新一代 EDA 工具的不断涌现,对计算资源的需求永无止境。调度系统必须具备良好的水平扩展性(Scalability),能够轻松地管理从几千到几十万个计算核心的超大规模集群。同时,随着云计算、容器化(Docker)和 AI/ML 等新技术的兴起,传统的、僵化的调度架构难以适应未来的发展。如何构建一个开放、可扩展、能够拥抱新技术的现代化调度平台,是所有EDA 公司都需要思考的战略性问题。
为了应对上述挑战,EDA 任务调度的解决方案也在不断演进,从经典的 HPC 作业调度器,到拥抱云计算的弹性架构,再到引入 AI/ML 的智能化调度,呈现出一条清晰的技术发展脉络。
-
公平共享 (Fair-share):这是解决多用户/多项目资源争用的关键。调度器会根据预设的份额(Share)和历史资源使用情况,动态调整用户的任务优先级。确保没有任何一个用户或项目可以长时间霸占所有资源,保证了资源的公平分配。 -
基于优先级的抢占 (Priority-based Preemption):允许高优先级的紧急任务(如 ECO 任务)抢占正在运行的低优先级任务的资源,以满足关键业务的时效性要求。 -
负载阈值 (Load Threshold): EDA应用所需资源无法有效预估,利用基于负载阈值的调度可以保障服务在利用率最大的情况下不过载,尤其是避免内存耗尽导致主机卡死的情况。 -
多样性的负载支持:支持与EDA应用的深度集成,如在一些CAD工具里可以直接通过调度器跑计算任务;支持调度图形桌面,实现桌面与计算共享有限的高性能计算资源;支持调度容器任务,以解决老版本操作系统对新的硬件的支持问题等。
EDA的作业流中有许多负载的依赖关系,这些作业流一般由开源的自动化流程管理软件实现,如简单流程可以用Jenkins来实现,较为复杂的流程用Apache Airflow或Nextflow通过Python编程的方式实现。这些工具与调度器的集成通过不断查询作业状态来完成。而同一集群中可能有几十到上百个这样的流程自动化工具同时在跑。这些工具不断地运行bjobs命令查询作业状态,调度器对这些命令的响应时间直接影响项目流程的进度。

上图展示了一个典型的本地(On-premises)EDA HPC 集群架构。用户通过图形桌面或登录节点提交任务,同时流程自动化软件也自动提交海量任务。调度器(如SkyForm AIP)的Master 节点负责接收、排队和决策,然后将任务分派到合适的计算节点上执行。所有节点共享高性能的并行文件系统(如NetApp 或GPFS)和许可证服务器。
下图是在一个5万个核的集群中测试100万个平均运行时长2-3分钟左右任务的调度性能。调度器为SkyForm AIP 10.25.0。

整个100万任务在一个小时左右完成。
下图展示了在上面的测试环境中,并发作业查询的时间。

10个并发查询1百万个任务状态(bjobs -a)的返回时间为2分钟多一点。而查询单个作业,或10个以内作业的时间的查询响应时间基本在2秒以内,如下图所示:
-
AWS提供了基于EC2的多样化实例(计算优化、内存优化等)、高性能存储服务FSx for Lustre,以及AWS ParallelCluster和Scale-Out Computing on AWS等工具来快速构建和管理弹性的 HPC 集群。 -
Azure凭借其HPC虚拟机、Azure CycleCloud等工具,也为半导体设计提供了强大的支持。 -
Google Cloud的Compute Engine和Filestore等服务同样被广泛应用于EDA 领域。
-
环境一致性:彻底解决了因环境差异导致的任务失败问题。 -
快速部署与扩展:可以在几秒钟内启动或销毁成百上千个 EDA 任务实例。 -
微服务化:更容易将庞大的 EDA 流程拆分为更小、更易于管理的服务。 -
资源共享:容器任务可以与EDA任务共享集群中的高性能资源。
• 调度器云弹性支持:EDA云上集群最大的特点是充分利用云的弹性资源实现根据任务资源需求实现弹性伸缩。由于EDA任务对于资源的要求变化大,弹性伸缩时需要匹配作业的资源需求和云主机的配置,以优化性价比。这就需要通过调度器来驱动云主机的启停,而不是直接使用公有云自身的自动伸缩能力(因为自动伸缩无法感知队列中的EDA任务和其资源需求)。先进的调度器如LSF和SkyForm AIP都可通过调用云API根据作业需求自身动态伸缩集群大小。
• PPA优化与设计空间探索:AI/ML 的应用已经超出了调度本身,开始深入到EDA 工具和流程的核心。例如,利用AI 技术来优化芯片的功耗、性能和面积(PPA - Power, Performance, and Area),自动探索数百万种可能的物理设计方案,找到最优解。这反过来也对调度系统提出了新的要求,需要能够支持这种大规模、探索性的AI 驱动型工作负载。
AI/ML赋能的智能化EDA 调度概念图
上图描绘了 AI/ML 如何融入 EDA 调度流程。数据收集模块不断汇集任务、资源和许可证的实时与历史数据。AI 引擎中的预测模型和优化算法对这些数据进行分析,为调度器提供更智能的决策支持,例如预测任务的运行时长和资源需求、推荐最佳的调度策略,甚至主动进行资源配置的优化。
- 2022-03-22
- 2022-03-22
- 2022-03-22
- 2022-03-22
- 2022-03-18
- 2022-03-18