25、自动化配置与离线学习在优化算法中的应用

自动化配置与离线学习在优化算法中的应用

1. GCC 编译器的自动配置

1.1 性能优化的影响因素

在优化算法的执行时间方面,系统和基准测试对性能提升有着显著影响。不同的机器和基准测试组合会导致性能提升的差异。例如,ACOTSP ls3 在 m2 机器上性能提升最大,而 ILS 在 m5 机器上性能提升最大。这表明 -O3 激活的某些优化选项,在 m5 上执行 ILS 时非常有利,但同样的设置在同一机器上对 ACOTSP ls3 似乎不太有利。此外,不同机器的结果变异性不同,这可能意味着某些机器更容易受到算法随机行为的影响。因此,即使针对特定场景进行了调整,系统对编译过程性能的影响仍然很大,好的配置在不同系统之间并不总是可移植的。

1.2 实验结果

1.2.1 仅配置优化标志(GCCflags)

使用 irace 对 GCC 的优化标志(GCCflags)和带有数值参数的标志(GCCflags + num)进行配置。总体而言,irace 能够在所有基准测试中实现比 -O3 更快的速度提升。在仅配置标志(GCCflags)时,除了 ACOTSP ls3 有两次执行结果略逊于 -O3(0.98 和 0.99)外,其他基准测试的性能都有明显提升。不过,ACOTSP ls3 的平均速度提升仍达到了 1.03。在 GCCflags 场景下,ILS 和 EMILI 获得了最大的速度提升。

基准测试 GCCflags 速度提升情况
ACOTSP ls0 有提升
ACOTSP ls3 两次略逊于 -O3,平均 1.03
ILS 最大速度提升之一
LKH 有提升
TS 有提升
EMILI 最大速度提升之一
1.2.2 配置优化标志和数值参数(GCCflags + num)

配置优化标志和数值参数(GCCflags + num)在不同基准测试中得到了不同的结果。在 ACOTSP ls3、ILS 和 LKH 场景中,irace 获得的速度提升有所增加;而在 ACOTSP ls0、TS 和 EMILI 中,速度提升(与 GCCflags 相比)有所降低。对于 EMILI,GCCflags + num 获得的速度提升仅比 GCCflags 略小;对于 TS,平均速度提升比 GCCflags 有所降低。尽管如此,irace 获得的所有配置的平均性能都优于 -O3。

ACOTSP ls0 在 GCCflags + num 下的结果比配置 GCCflags 时更差,但相对于 -O3 的平均速度提升仍为 1.03,10 次执行中最差的速度提升也仅为 0.99。ACOTSP ls0、EMILI 和 TS 在配置 GCCflags + num 时性能下降,可能是由于配置空间的大小和难度。GCCflags + num 场景的参数更多(366 个),且配置预算与 GCCflags 场景相同,搜索可能受到限制。此外,GCCflags + num 场景似乎不太均匀,并且比 GCCflags 场景产生更多的失败执行。这在某些情况下可能有助于配置过程,因为可以轻松缩小搜索空间。

1.2.3 解决 GCCflags + num 配置问题的方法
  • 增加配置预算 :如果可行的话,增加配置过程的资源投入,以扩大搜索范围。
  • 提供初始配置 :可以将 -O3 或 -O2 作为初始配置,为搜索提供一个较好的起点。
  • 增加实例数量 :增加开始消除配置所需的实例数量,以便更好地估计配置的性能,应对某些基准测试中实例内或实例间执行时间的高变异性。
1.2.4 随机森林模型分析

使用 irace 的 10 次执行获得的性能数据训练随机森林模型,以分析配置场景的特征。在构建训练数据集时,排除了产生失败编译或执行的配置,仅包含有效的执行数据点。实例作为变量包含在训练数据中,某些基准测试中,实例是解释大部分变异性的变量。这是由于不同实例所需执行时间的变异性造成的。

基准测试 GCCflags 下前五重要参数 GCCflags + num 下前五重要参数
ACOTSP ls0 instance(89.9)、falign - labels(39.1)、fguess - branch - probability(6.2)、fstrict - aliasing(5.4)、ftree - ch(0.8) instance(90.5)、falign - labels(13.6)、ftree - loop - optimize(3.8)、fstrict - aliasing(0.9)、ftree - ter(0.5)
ILS falign - labels(45.1)、instance(15.3)、fstrict - aliasing(1.1)、fcaller - saves(4.4)、ftree - pre(3.2) max - unswitch - insns(29.4)、falign - labels(7.0)、ftree - ter(5.2)、ftree - loop - im(2.3)、fomit - frame - pointer(2.2)
TS falign - labels(2.5)、fcaller - saves(4.4)、fstrict - aliasing(5.4)、ftree - loop - im(5.2)、flto - partition(0.5) falign - labels(38.9)、ftree - ch(1.3)、instance(10.1)、ftree - loop - optimize(2.9)、fomit - frame - pointer(2.2)
ACOTSP ls3 instance(87.3)、falign - labels(5.5)、fcaller - saves(0.6)、fstrict - aliasing(0.5)、finline - limit(0.2) instance(87.4)、falign - labels(3.5)、fcaller - saves(1.0)、fstrict - aliasing(0.9)、parloops - schedule(0.3)
LKH instance(95.4)、falign - labels(2.0)、flto - partition(0.2)、fif - conversion(3.3)、fipa - pure - const(1.3) instance(93.8)、falign - labels(2.0)、flto - partition(0.5)、fif - conversion(3.0)、fipa - pure - const(1.2)
EMILI finline(50.3)、instance(40.0)、fif - conversion(3.3)、fcode - hoisting(2.4)、fipa - pure - const(1.3) finline(44.1)、instance(40.2)、fif - conversion(3.0)、fcode - hoisting(2.4)、fipa - pure - const(1.2)

对于用 C 编写算法的基准测试(ACOTSP、ILS、TS 和 LKH),最重要的选项是那些试图优化内存分配和寄存器使用(如 falign - labels、fstrict - aliasing、fcaller - saves、falign - function、fomit - frame - pointer)、链接过程(flto - partition)以及编译器使用的源代码内部表示优化(ftree 标志)的选项。相反,对于 EMILI(唯一用面向对象的 C++ 编写的程序),优化似乎更侧重于内联(finline)、分支优化(fif - conversion、fcode - hoisting)和避免不必要的函数调用(fipa - pure - const),这与面向对象代码中常见的大量小函数一致。大多数参数在扩展到数值参数调优时保持相似的重要性。对于 ILS,数值参数 max - unswitch - insns 是最重要的,它控制编译器决定是否展开循环的阈值。

1.3 结论

减少优化算法的执行时间对开发者和用户来说非常重要。通过优化编译选项可以显著减少计算时间,这既可以作为算法配置过程后的额外步骤,也可以作为完整配置过程的一部分,以解决算法组件和编译选项之间的相互作用。irace 的实验结果令人鼓舞,它能够找到比 GCC 默认优化标志(-O2 和 -O3)显著更好的设置。

1.4 未来工作展望

  • 扩展实验范围 :将实验扩展到具有不同特征的新基准测试,以及用于自动调优方法的标准编译器基准测试集。
  • 研究实例类型和大小的影响 :研究实例类型和大小对 GCC 选项的影响,以及它们之间的关系。
  • 分析基准测试特征 :进一步分析实验获得的信息,提取导致某些优化标志对性能产生更大影响的基准测试特征。
  • 优化 irace 设置 :专门调整 irace 的设置,以配置编译选项,例如提供一组初始有前景的配置或采用额外的剪枝技术来改进搜索。
  • 探索其他自动配置工具 :研究使用其他自动配置工具,如 SMAC,并将当前方法与专门为优化编译器标志设计的其他方法(如 OpenTuner 和 COLE)进行比较。
  • 共享配置文件 :提供用于配置 GCC 选项的配置文件,以便其他研究人员尝试配置自己的算法以获得更好的性能。

2. 基于 Elman 网络的选择超启发式离线学习

2.1 超启发式与学习分类

超启发式是用于解决计算难题的启发式方法,通常将问题表示为优化问题,目标是最小化定义在解空间上的目标函数。选择超启发式从给定的一组低级启发式中选择启发式,并依次应用它们来优化特定问题。超启发式的学习可分为在线学习和离线学习。在线学习基于超启发式执行期间的低级启发式选择和目标函数值;离线学习则基于超启发式在固定数量的基准问题上计算的低级启发式选择和目标函数值数据库。

2.2 离线学习的相关研究

多种机器学习算法已被用于离线学习:
- 分类器系统 :应用于 1D 装箱问题,系统学习一组将当前问题状态特征与特定启发式关联的规则。通过在多个问题上进行训练,该系统能够在未见过的问题上表现良好,实现泛化。
- 基于案例的推理(CBR) :成功应用于考试时间表问题。CBR 的假设是“相似的问题将有相似的解决方案”。它收集和存储以前的问题及其“好”的解决方案(源案例),通过基于相似性的检索过程,将源案例与当前问题进行比较,并选择在相似情况下成功使用的启发式。这里采用了两阶段学习过程,一个用于案例表示(或特征选择),另一个用于源案例选择。
- 混乱遗传算法 :用于演化表示问题状态和相关启发式的条件 - 动作规则组合。每个染色体代表一个超启发式,包含确定在哪个问题状态应用哪个启发式的规则集。测试时,这些超启发式泛化良好,能有效地解决许多测试问题。

2.3 研究目标与方法

传统上,学习用于通过改进在多个训练问题的搜索过程中特定点的单个启发式选择来提高优化性能。然而,近期研究认为启发式选择应被视为选择序列的一部分。某些启发式排序是有意义的,而其他排序则不然。本研究的目标是测试在离线学习数据库中可以找到在多个问题甚至问题域中有效的启发式子序列的论点。

具体方法如下:
1. 执行一个简单的选择超启发式算法,在著名的 HyFlex 基准问题集上运行,将得到的低级启发式选择序列和目标函数值用于构建离线学习数据库。
2. 使用 Elman 网络从离线数据库中选择的合适序列集中学习,自动提取有效的启发式子序列。Elman 网络是递归神经网络,自然地学习、处理和生成数据序列。
3. 训练 Elman 网络使用留一法交叉验证方法,训练后,使用 Elman 网络计算新的启发式序列,并在从 HyFlex 集抽取的未见过的基准问题上进行评估。目标是确定网络是否从训练序列中实现了泛化,即网络能否产生一个启发式选择序列,在未见过的例子上评估时优于训练序列。

2.4 实验结果

实验结果表明,Elman 网络能够以 99% 的置信度进行域内学习和泛化,并且在许多情况下产生比训练序列更好的结果。然而,当使用跨域训练集进行训练时,Elman 网络没有表现出泛化能力,这表明跨域泛化是一个更难的问题,在一个域中学习的策略不一定能转移到另一个域。

2.5 总结

通过对 GCC 编译器自动配置和基于 Elman 网络的选择超启发式离线学习的研究,我们看到了在优化算法执行时间和解决计算难题方面的有效方法。在 GCC 配置中,irace 为优化编译选项提供了有前景的结果,而 Elman 网络在超启发式离线学习中展示了域内学习和泛化的能力。未来的研究可以进一步扩展这些方法,以应对更多类型的问题和场景,提高算法的性能和适用性。

graph LR
    classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px

    A([开始]):::startend --> B(执行选择超启发式算法):::process
    B --> C(构建离线学习数据库):::process
    C --> D(选择合适序列集):::process
    D --> E(Elman 网络学习):::process
    E --> F(计算新启发式序列):::process
    F --> G(在未见过的问题上评估):::process
    G --> H{是否泛化?}:::process
    H -->|是| I(域内学习和泛化成功):::process
    H -->|否| J(跨域泛化失败):::process
    I --> K([结束]):::startend
    J --> K

这个流程图展示了基于 Elman 网络的选择超启发式离线学习的主要步骤,从执行超启发式算法到最终评估是否实现泛化。通过这个流程,我们可以清晰地看到整个研究过程的逻辑和关键环节。

3. 技术对比与分析

3.1 GCC 配置方法对比

在 GCC 编译器的配置中,我们采用了两种不同的配置方式:仅使用优化标志(GCCflags)和同时使用优化标志与数值参数(GCCflags + num)。下面通过表格对这两种方式进行详细对比:
| 配置方式 | 优点 | 缺点 | 适用场景 |
| ---- | ---- | ---- | ---- |
| GCCflags | 配置相对简单,多数基准测试能提升性能,ILS 和 EMILI 可获较大提速 | 部分基准测试(如 ACOTSP ls3)有小概率性能略逊于 -O3 | 对配置空间复杂度要求不高,追求稳定性能提升的场景 |
| GCCflags + num | 部分基准测试(如 ACOTSP ls3、ILS、LKH)能进一步提升速度 | 配置空间大,参数多(366 个),易导致搜索受限,部分基准测试(如 ACOTSP ls0、TS、EMILI)性能下降 | 对性能有更高要求,且有足够资源进行搜索配置的场景 |

从上述对比可以看出,不同的配置方式各有优劣,在实际应用中需要根据具体的基准测试和资源情况进行选择。

3.2 离线学习算法对比

在离线学习方面,我们介绍了分类器系统、基于案例的推理(CBR)和混乱遗传算法,以及本次研究使用的 Elman 网络。以下是对这些算法的对比:
| 算法 | 学习原理 | 泛化能力 | 应用场景 |
| ---- | ---- | ---- | ---- |
| 分类器系统 | 学习问题状态特征与启发式的关联规则 | 能在未见过的问题上泛化 | 如 1D 装箱问题等特征明确的优化问题 |
| 基于案例的推理(CBR) | 假设相似问题有相似解,通过相似性检索选择启发式 | 能解决相似问题 | 如考试时间表问题等有历史案例可参考的问题 |
| 混乱遗传算法 | 演化条件 - 动作规则组合来表示超启发式 | 能泛化并有效解决测试问题 | 适合规则组合优化的问题 |
| Elman 网络 | 从序列数据中学习,处理和生成启发式序列 | 域内泛化能力强,跨域泛化较难 | 注重启发式序列有效性的优化问题 |

通过对比可以发现,不同的离线学习算法适用于不同类型的问题和场景。Elman 网络在域内学习和泛化方面表现出色,但在跨域泛化上还存在挑战。

4. 操作步骤总结

4.1 GCC 编译器配置操作步骤

  • 仅配置优化标志(GCCflags)
    1. 确定要使用的基准测试集。
    2. 运行 irace 算法,进行 10 次执行,获取 GCC 配置。
    3. 将这些配置与 GCC 使用 -O3 时的执行时间进行对比,评估性能提升。
  • 配置优化标志和数值参数(GCCflags + num)
    1. 同样确定基准测试集。
    2. 运行 irace 算法,在配置过程中包含数值参数。
    3. 对比不同基准测试下 GCCflags + num 与 GCCflags 以及 -O3 的性能。
    4. 若遇到性能下降问题,可考虑增加配置预算、提供 -O3 或 -O2 作为初始配置、增加开始消除配置所需的实例数量。

4.2 基于 Elman 网络的离线学习操作步骤

  • 构建离线学习数据库
    1. 选择 HyFlex 基准问题集。
    2. 执行简单的选择超启发式算法,记录低级启发式选择序列和目标函数值。
    3. 将这些数据整理成离线学习数据库。
  • 训练 Elman 网络
    1. 从离线数据库中选择合适的序列集。
    2. 使用留一法交叉验证方法训练 Elman 网络。
  • 评估泛化能力
    1. 使用训练好的 Elman 网络计算新的启发式序列。
    2. 在未见过的 HyFlex 基准问题上评估这些序列。
    3. 判断网络是否实现泛化,即新序列是否优于训练序列。
graph LR
    classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px

    A([开始]):::startend --> B(确定 GCC 配置方式):::process
    B -->|GCCflags| C(运行 irace 配置 GCCflags):::process
    B -->|GCCflags + num| D(运行 irace 配置 GCCflags + num):::process
    C --> E(对比与 -O3 性能):::process
    D --> E
    E --> F{性能是否满意?}:::process
    F -->|是| G(结束 GCC 配置):::process
    F -->|否| H(调整配置策略):::process
    H --> D
    G --> I(构建离线学习数据库):::process
    I --> J(选择序列集训练 Elman 网络):::process
    J --> K(计算新启发式序列):::process
    K --> L(在未见过问题上评估):::process
    L --> M{是否泛化?}:::process
    M -->|是| N(学习和泛化成功):::process
    M -->|否| O(调整训练策略):::process
    O --> J
    N --> P([结束]):::startend

这个流程图展示了从 GCC 编译器配置到基于 Elman 网络的离线学习的完整流程,包含了各个步骤的判断和调整环节,有助于我们清晰地理解整个操作过程。

5. 总结与展望

5.1 总结

本文围绕优化算法的执行时间展开研究,主要涉及 GCC 编译器的自动配置和基于 Elman 网络的选择超启发式离线学习两个方面。在 GCC 配置中,irace 算法在优化编译选项上表现出色,能找到比 GCC 默认优化标志更好的设置。通过对比 GCCflags 和 GCCflags + num 两种配置方式,我们了解到它们各自的优缺点和适用场景。在离线学习方面,Elman 网络在域内学习和泛化上具有良好的性能,但跨域泛化仍是一个难题。不同的离线学习算法适用于不同类型的问题,我们需要根据具体情况进行选择。

5.2 展望

未来,我们可以从以下几个方面进一步深入研究:
- GCC 配置优化 :继续探索更有效的配置策略,结合更多的基准测试和实例类型,提高 GCC 编译器的性能优化效果。
- Elman 网络改进 :研究如何提高 Elman 网络的跨域泛化能力,例如引入更多的领域知识或改进网络结构。
- 技术融合 :尝试将 GCC 配置和 Elman 网络离线学习技术进行融合,探索它们之间的协同作用,以实现更高效的优化算法。
- 实际应用推广 :将这些技术应用到实际的工业生产和科研项目中,验证其在实际场景中的有效性和实用性。

通过不断的研究和改进,我们有望在优化算法的执行时间和解决计算难题方面取得更大的突破,为相关领域的发展提供更有力的支持。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值