Heptagon: 一项Scade工具的学术版原型
We develop the langage Heptagon, a first order functional synchronous son of Lustre. The compiler is an academic prototype of the industrial tool Scade.
—— Léonard Gérard,<Programming parallelism with futures in Heptagon a synchronous functional language, and, study of Kahn networks aiming synchronous compilation>
2013年,Léonard Gérard在其博士论文中介绍了HeptagonHeptagon。这里将复述Leonard对相关工作的介绍,详细内容,可参考[Leonard13]。
同步语言诞生于20世纪80年代,旨在对高可靠性实时反应系统进行建模、设计与实现。随着被控系统的复杂度不断提升,执行速度已成为一项关键指标。与此同时,处理器性能的提升更多体现在核心数量增加上,而非运算速度的提高。因此,我们亟需一种兼具高效性与安全性的并行执行方案。
同步语言在设计之初便融入了 “并行” 理念,以增强建模的表达能力。但其编译过程主要面向电路设计或生成串行代码。所有同步语言均具备形式化语义—— 这一特性为代码的正确分布式部署提供了可能,然而,对语义的严格保留可能会成为制约生成代码效率的瓶颈,尤其当需要维持系统 “全局瞬时性” 概念时,这一矛盾更为突出。
卡恩网络与语义模型
我们关注的语义模型,是基于函数式数据流的卡恩网络(Kahn Networks)。这类网络用于对分布式计算单元进行建模,计算单元之间通过无界队列实现通信。在该模型框架下,分布式部署无需依赖任何同步机制或模型外部信息。通过对通信队列的运行过程进行分析,卡恩语义能够屏蔽实际执行过程的细节,同时确保计算结果的函数确定性(即输入确定时输出唯一)。
在三种原始同步语言中,仅有Esterel属于命令式语言,且不基于数据流模型;Signal以建模为核心,采用关系型设计;而Lustre是首个基于函数式数据流的同步语言。其早期的指称语义(Denotational Semantics)已呈现出卡恩语义的特征,而Caspi与Pouzet在 “同步卡恩网络” 方面的研究,通过将原语 “current” 替换为 “merge”,最终确立了Lustre与卡恩语义的关联,并催生出高阶函数式同步语言Lucid Synchrone。
Heptagon 语言的起源与特性
Heptagon 语言正是源于这一技术脉络:其最初版本名为MiniLustre(LCTES’08),开发初衷是实现自动机的源到源编译,采用极简主义设计理念。Heptagon属于一阶函数式语言,其编译器为一款学术原型工具,与工业级工具Scade类似 —— 后者被广泛应用于高可靠性嵌入式系统的设计行业。
得益于卡恩语义的支撑,Heptagon程序可直接等同于一个卡恩网络:通常而言,Heptagon中的每个函数调用都可视为一个独立进程,通过队列与程序的其他部分进行通信。在通用模型中,队列的长度无法被限定;但同步语言通过 “时钟” 机制(在逻辑瞬时标记数据流的存在),确保了所有生成的值能在同一瞬时被消费。因此,Heptagon程序具备 “同步卡恩语义”,可保证网络中的队列在两个瞬时之间处于空状态。在此前提下,即便网络处于异步状态,也能通过 “单元素队列” 实现有效执行。这意味着,一旦完成程序的模块拆分,分布式部署本身不再存在技术障碍,真正的挑战在于如何提升部署的效率。
并行执行的效率瓶颈与优化方向
确保执行效率涉及两个相互关联的核心维度:
- 计算解耦度:需在计算任务的依赖关系中保留一定延迟,为并行执行提供空间;
- 计算粒度:需提高 “计算时间与通信频率的比值”,即减少通信开销对计算效率的影响。
然而,Heptagon程序的同步语义与时钟机制却呈现出相反的特性:它们允许开发者仅依赖 “瞬时解耦”(即仅在单个瞬时内实现解耦),且每个瞬时最多仅计算一个值;此外,为保证系统的快速响应,瞬时的时间跨度通常极短。这两大特性直接制约了并行执行的效率。
为突破性能瓶颈,工具Ocrep采用数据流静态分析技术,对生成代码的控制逻辑与通信过程进行优化。在该工具的框架下,开发者需指定计算任务的部署位置,但计算单元间的解耦与同步过程会自动完成。对于部分Signal语言程序,可通过通用工具SynDEx或Polychrony实现分布式部署。
基于上述研究,我们得出两项关键结论:
- 结论一:开发者主导的并行控制
我们主张由开发者在源代码中直接控制并行逻辑,使其能够自主决定通信与同步发生的瞬时。为此,我们提出在Heptagon中引入future机制:该机制既能赋予开发者控制权,又属于 “可移除注解”—— 删除后不会改变程序的指称语义。
- 结论二:计算粒度的深层优化
计算粒度问题本质上涉及数据依赖、时钟选择与模块化编译三大核心议题。与同类语言类似,Heptagon对可编写的卡恩网络施加了限制,导致这三大议题被割裂处理。为厘清三者间的关联,我们回归卡恩网络本身,最终提出了 “有序反应网络”(ordered reactive networks)这一子类的定义:这是唯一可通过时钟实现 “模块化行为描述” 的网络类型,且无需限制调用上下文。此类网络具备 “标准形式时钟签名”,能最大限度提升计算粒度。为实现这一概念,我们引入 “整数时钟”(integer clocks)—— 可在单个瞬时内完成多个值的通信。
基于上述成果,我们重新审视了Heptagon、Signal以及Lucid Synchrone的调度策略,同时为Lucy-n(与卡恩网络兼容性最高的同步语言)设计了全模块化分析方案。
[Leonard13]: Léonard Gérard, Programmer le parallélisme avec des futures en Heptagon un langage synchrone flot de données et étude des réseaux de Kahn en vue d’une compilation synchrone