并行软件构建的重用方法
1. 重用方法概述
在软件开发过程中,软件组件的通用实例化是一种关键的重用方法,它主要支持程序结构、数据结构或算法的重用。在实例化时,抽象模式会被复用,通用参数会被具体的类型、函数、语句或其他程序结构所替代。这种概念在多种编程语言中都有紧密的集成,例如 Ada、C++ 和 Eiffel。
宏替换技术也能产生类似的效果,但它缺乏一致性检查。而一些骨架结构则基于类似的概念,它们用高阶函数的符号来描述并行算法模式。
有一种由积极协作的工具组成的系统,其中可能包含为整个产品贡献组件的生成器。例如 Eli 系统,它基于上述的重用方法构建,主要用于语言处理软件系统的构建。可以将其视为一个由许多协作工具组成的应用程序生成器。
Eli 系统生成的产品的软件架构是一种被广泛接受的语言处理器分解模型,其固定接口确保了不同工具创建的组件能够相互适配。该系统集成了多个生成器,如扫描器、解析器、属性评估器和定义表的生成器,甚至还有一个能完善具体和抽象语法并创建解析器语法的生成器。整个过程由 Odin 系统进行描述和控制。
系统中嵌入了一个可重用的通用模块库,每个模块实现了语言实现中常见子任务的解决方案,例如根据 C 语言的作用域规则进行名称分析的基本概念。通过多次实例化,可以为不同类型的标识符(如变量和标签)设置不同的作用域规则。由于模块由多种不同语言编写的生成器规范和程序组件组成,因此通用参数替换需要通过与语言无关的文本替换来完成。
通过这种方式,Eli 系统体现了语言实现领域的专家知识,并为非专家提供了先进的实现技术。其原理也为并行程序领域的工具集构建提供了思路、方法和技术。
2. 工具集结构
以 BBSYS 系统为例,它包含了实现并行分支限界程序的专家知识,支持从访问并行机器的机制到分布式工作算法的负载平衡策略等多个方面。这些知识被封装起来,用户无需关注并行解决方案的具体细节,只需提供描述其问题实例的信息,例如表示分支限界解决方案的数据类型。
从用户的角度来看,系统分为四个层次:
|层次|描述|
| ---- | ---- |
|1|最低层抽象了特定并行机器的技术,如程序的编译、配置、执行以及处理器的分配。该层的工具是调用编译器和特定机器平台其他组件的脚本,同时还分配了用于消息传递的标准库。目前支持多种不同的平台,如工作站集群、Transputer 系统和 SIMD 计算机 MasPar MP1。这一层主要重用制造过程。|
|2|提供特定应用领域典型的实用工具、并行算法和数据结构。对于 BBSYS 来说,包括负载平衡库和优先队列的并行实现,如 PPBB 库。这一层重用了预先定义的特定领域标准组件。|
|3|算法层,分配了算法解决方案的模块化分解组件,在 BBSYS 中是分支限界算法的组件。针对不同问题特征和编程范式的变体被组织在一个库中,库模块具有通用参数,在实例化时会被特定问题的数据类型和操作所替代。生成程序的结构由特定领域的软件架构决定。在这一层,用户从库中选择模块变体用于软件架构中的特定组件,并为特定程序实例提供通用参数。这一层对用户隐藏了并行解决方案,用户可以用顺序分支限界概念(如分支、限界和成本函数)以及解决方案的数据类型来做出贡献。这里重用了固定软件架构内的算法和数据结构的通用方案。|
|4|最高层适用于非算法应用领域。如果该领域的软件需要构建多种变体,并且子任务需要使用并行机器来解决复杂问题,那么这一层通常包含根据特定领域语言描述创建程序的生成器。在 BBSYS 中,这一层未被使用。|
下面是工具集概念层次的 mermaid 流程图:
graph LR
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
A(用户):::process --> B(工具系统):::process
B --> C1(并行计算机接口):::process
B --> C2(并行基本服务和算法):::process
B --> C3(并行算法解决方案):::process
B --> C4(特定领域模型):::process
C1 --> D1(编译器、访问、执行、基本库):::process
C2 --> D2(负载平衡库、PPBB 库等):::process
C3 --> D3(分支限界算法组件):::process
C4 --> D4(生成器、库):::process
3. 特定领域软件架构
工具集的构建是为了在其应用领域中为许多问题实例生成软件变体,例如分支限界程序。这些问题的需求通常在多个维度上有所不同,如最小化或最大化问题、计算一个或所有解决方案、采用深度优先或最佳优先搜索等。这些需求的变化可能会影响产品的不同部分,因此拥有一个适用于所有变体的合适模块化分解至关重要,这样可以将需求变化的影响局部化。
以 BBSYS 的软件架构为例,它适用于所有目标机器。对于特定的目标机器,会为软件架构中的某些组件选择特定的模块。该架构的核心概念是在工作模块和分布式工作负载的数据模块中实现并行分支限界。通过根据目标机器的网络拓扑选择替代的负载平衡模块,可以创建不同的变体。
架构中大部分模块是通用的,它们通过通用参数进行实例化,如问题实例和解决方案表示的数据类型,以及分支、限界、成本计算等函数。这里使用了一种非常通用的与语言无关的通用实例化机制,它只是简单地进行文本替换,允许在实例化时替换任何类型的程序结构,但模块设计者需要谨慎使用,因为这种方法缺乏像编程语言中更严格的泛型那样的参数替换一致性检查。
下面是 BBSYS 软件架构的 mermaid 流程图:
graph LR
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
A(主程序):::process --> B(问题特定数据类型和函数):::process
A --> C(分布式工作负载数据模块):::process
A --> D(工作模块):::process
B --> E(输入/输出):::process
C --> F(负载平衡):::process
D --> G(计算最优值):::process
E --> H(统计收集):::process
F --> I(本地队列):::process
G --> J(输出解决方案):::process
4. 软件制造
工具集用于为并行机器构建软件,其制造过程相当复杂,涉及多个不同的工具和许多中间产品。该过程融入了专家知识,通过重用这些知识来实现软件构建的自动化,可以将其视为特定软件开发的工作流模型,在某些情况下可以无需人工干预执行。
以在 SC - 320 Transputer 系统上使用 INMOS - C - Toolset 安装和执行一个由两个 C 模块和一个过程拓扑描述组成的排序程序为例,其过程如下:
1. 过程拓扑描述由一个生成器处理,生成配置信息。
2. 配置信息被添加到编译和链接后的 C 模块中。
3. 利用这些信息在机器上分配处理器。
在工具集中,另一个需要主动制造步骤的情况是根据问题特征和机器属性选择多个算法变体之一,例如选择负载平衡模块。
整个工具集各层的制造过程由 Odin 系统进行建模。通过在 Odin 的规范语言中制定所谓的推导图,描述每个工具调用的输入和输出以及系统中的数据流。Odin 的解释器根据该图确定对于给定请求应按何种顺序执行哪些步骤以及使用哪些参数。中间产品会被缓存,如果它们所依赖的产品没有改变,后续请求可以重用这些中间产品,这是 Odin 系统相对于 Unix 工具 Make 的一个优势。
这种对制造过程的重用是该方法的典型特点,其效果是基于被动程序结构的其他强大重用方法(如骨架、面向对象层次结构或框架)所无法实现的。
5. 程序生成器
程序生成器是最强大的重用方法之一,它包含了根据问题实例的声明性描述创建解决方案的知识。
例如,有一个用于创建并行程序配置文件的工具。像 SC - 320 - Transputer 系统这样的机器的网络结构可以进行调整,以更好地适应程序的过程结构,从而节省路由步骤的时间。INMOS - C - Toolset 需要提供三个配置文件:所需的处理器网络、从程序角度看的过程网络以及两者之间的映射。由于文件内容密切相关且手动编写的符号较为繁琐,因此使用生成器非常合适。该生成器可以从一个使用通用图形编辑器绘制的带注释的图形中创建这三个文件。
这个生成器显著提高了抽象级别,从配置文件的低级操作符号提升到了具有可视化表示的图形符号。此外,它还会检查结构一致性,支持设计几乎任意的过程网络。不过,这个功能在 BBSYS 中未被使用,它被集成到了一个早期支持显式指定通信结构的程序开发的工具集中。
6. 软件配置的用户界面
使用 BBSYS 这样的工具集可以看作是一个软件配置任务。用户需要提供多个信息项,这些信息描述了特定问题实例的属性、对结果的要求,并提供特定数据类型和函数的程序片段。这些信息项相互关联,并且必须相对于驱动软件构建过程的一组规则保持一致和完整。这些规则和输入信息结构的设计编码了系统正确和有效使用的专家知识,它们被嵌入到一个配置程序及其图形用户界面中。
配置程序由工具 LaCon 根据信息的结构和类型描述以及一致性和完整性规则生成。根据描述,它会创建一个带有合适输入组件的窗口层次结构,并实现规则和帮助机制。最初,LaCon 是作为指定特定领域语言变体的工具开发的,但它足够通用,可以用于任何领域的配置程序生成。
输入项被组织在一个窗口层次结构中,每个窗口包含特定主题的信息。该层次结构体现了信息的抽象级别:上层用分支限界概念表达,而下层则允许更直接地影响生成的软件。详细级别的信息可以省略,系统会使用默认值。用户可以完全抽象出并行分支限界的实现细节。
输入组件由少量但足够的不同类型信息的图形小部件生成,例如用于判断是最小化还是最大化问题的二进制决策、固定分支度的数字、从多个目标机器中进行选择等。对于程序片段(如类型或函数),使用专门的编辑器提供框架,用户只需填充特定项即可。
当出现一致性检查违规时,例如在详细规范级别选择的本地堆策略与回溯模式请求不匹配,错误描述会根据违反的规则自动生成。
7. 结论
通过上述方法构建的工具集,为特定领域的并行程序开发提供了支持。它将并行机器、语言、编程模型、算法方法以及软件制造过程等方面的专家知识提供给非并行编程专家。
该方法基于强大的重用方法来实现软件构建的自动化:特定领域的软件架构是组合重用的基础,通过从库中选择和实例化通用模块来创建变体;制造过程由工具控制系统建模和执行;生成的带有图形用户界面的配置程序引导用户在高抽象级别上进行一致和完整的规范。
这种方法已经在并行分支限界程序的工具集上得到了验证,并成功应用于流水车间调度软件的构建。工具构建过程也在另一个算法领域(并行排序)中得到了重复应用。未来的工作可以将该方法应用于更多领域,并通过在工具集的最高层使用特定领域的生成器来更接近实际应用。
并行软件构建的重用方法
8. 技术要点总结
为了更清晰地理解整个并行软件构建重用方法的体系,下面对关键技术要点进行总结:
|技术要点|描述|
| ---- | ---- |
|通用实例化|支持程序结构、数据结构和算法的重用,通过将抽象模式的通用参数替换为具体类型、函数等实现。|
|宏替换|能产生类似通用实例化的效果,但缺乏一致性检查。|
|Eli系统|基于重用方法构建,用于语言处理软件系统构建,包含多个生成器和可重用通用模块库。|
|BBSYS层次结构|分为四层,每层提供不同抽象级别的支持,从并行机器技术抽象到特定领域软件创建。|
|特定领域软件架构|模块化分解适用于多种问题变体,便于控制需求变化的影响。|
|软件制造|复杂过程,融入专家知识,由Odin系统建模和控制,可重用中间产品。|
|程序生成器|根据问题实例声明性描述创建解决方案,提高抽象级别并检查结构一致性。|
|软件配置用户界面|由LaCon生成,引导用户提供一致和完整的信息,支持不同类型信息输入。|
9. 优势分析
这种基于重用方法构建并行软件工具集的方式具有多方面的优势:
-
提高开发效率
:通过重用通用模块、制造过程和预先定义的组件,减少了重复开发工作,大大缩短了开发周期。例如,在BBSYS中,用户可以直接使用库中的模块变体,而无需从头开始编写算法代码。
-
降低技术门槛
:封装了并行计算的复杂细节,使非并行编程专家也能利用并行计算的优势。用户只需要关注问题本身的描述,而无需深入了解并行机器的底层技术。
-
增强可维护性
:采用模块化分解的软件架构,使得需求变化的影响能够被局部化,便于对软件进行修改和扩展。例如,在BBSYS中,根据不同目标机器选择特定模块,而不影响整个软件架构。
-
保证一致性
:通过配置程序和一致性检查机制,确保用户提供的信息符合软件构建的规则,减少错误的发生。当出现一致性违规时,系统会自动生成错误描述,帮助用户快速定位问题。
10. 案例分析
下面通过两个具体案例进一步说明该方法的应用和效果:
案例一:并行分支限界程序工具集
BBSYS作为并行分支限界程序的工具集,成功应用于流水车间调度软件的构建。用户只需提供问题的相关信息,如数据类型、分支限界规则等,系统就能自动生成适合并行计算的程序。通过工具集的四层结构,从底层的并行机器访问到高层的算法实现,为用户提供了全面的支持。例如,在算法层,用户可以根据问题特征选择合适的模块变体,并提供通用参数,系统会根据特定领域的软件架构生成最终程序。
案例二:并行排序算法工具集
该方法同样应用于并行排序算法领域。在构建并行排序工具集时,采用了与BBSYS类似的思路,即模块化设计、通用模块重用和自动化制造过程。通过选择不同的排序算法变体和配置参数,能够快速生成适用于不同并行机器和问题规模的排序程序。这不仅提高了开发效率,还保证了程序的性能和可扩展性。
11. 未来展望
虽然该方法已经在多个领域取得了成功,但仍有一些方面值得进一步探索和改进:
-
拓展应用领域
:可以将该方法应用于更多的特定领域,如人工智能、数据分析等,为这些领域的并行程序开发提供支持。
-
优化工具集性能
:进一步研究如何提高工具集的运行效率和资源利用率,减少制造过程中的时间和空间开销。
-
加强领域特定生成器
:在工具集的最高层,开发更强大的领域特定生成器,使非编程人员也能轻松创建复杂的并行程序。
-
集成新兴技术
:结合新兴的并行计算技术,如量子计算、异构计算等,进一步提升并行程序的性能和功能。
12. 总结
通过对并行软件构建重用方法的研究和实践,我们可以看到这种方法在特定领域的并行程序开发中具有巨大的潜力。它将专家知识封装在工具集中,为非专家提供了便捷的开发途径,同时提高了开发效率、可维护性和软件质量。随着技术的不断发展和应用领域的不断拓展,相信这种方法将在更多领域发挥重要作用,推动并行计算技术的广泛应用。
下面是整个方法的流程 mermaid 流程图:
graph LR
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
A(用户需求):::process --> B(选择工具集层次):::process
B --> C(特定领域软件架构):::process
C --> D(选择模块变体):::process
D --> E(提供通用参数):::process
E --> F(软件制造过程):::process
F --> G(生成并行程序):::process
H(专家知识):::process --> I(工具集构建):::process
I --> B
J(一致性检查):::process --> E
J --> F
通过这个流程图,我们可以清晰地看到从用户需求到最终生成并行程序的整个过程,以及专家知识、一致性检查在其中的作用。这种结构化的方法为并行软件的开发提供了一种有效的途径,有助于提高开发效率和软件质量。
1953

被折叠的 条评论
为什么被折叠?



