24、利用 irace 实现 GCC 自动配置优化

利用 irace 实现 GCC 自动配置优化

1. 自动算法配置概述

算法配置是为特定类别的问题实例找到一组能展现良好实证性能的算法参数值,也就是算法配置。它可被定义为参数搜索空间上的优化问题,目标是确定能最大化算法性能的参数设置。

一般来说,算法配置场景包含以下要素:
- 参数搜索空间:由定义为变量的算法参数及其定义域构成。
- 训练和测试实例集。
- 总配置预算。

参数大致可分为两类:
- 指示算法组件选择的参数,例如进化算法的交叉算子或精确算法的分支策略。
- 控制算法组件行为的参数,例如禁忌列表的长度或扰动的大小,其定义域通常对应离散或连续域的数值。

参数还可能存在条件关系,即其使用依赖于其他参数的值。例如,禁忌列表长度参数的使用取决于是否选择禁忌搜索作为局部搜索。

场景的同质性体现了参数空间中配置在实例集上相对性能的一致程度。高度同质的场景中,配置对所有问题实例的表现始终良好(或糟糕);而异质场景中,某些配置在部分实例上表现最佳,在其他实例上则表现不佳。算法可以针对不同的性能指标进行配置优化,如解决方案质量、运行时间、SAT 计数等。配置性能的评估通常定义为所选性能指标在实例集上的聚合(通常是均值或中位数)。由于优化算法通常具有随机性,配置的实际性能只能通过多次重复来估计。

2. irace 算法配置器

irace 包是一个基于迭代竞赛的算法配置器,例如迭代 F - race。它是通用的配置器,只需要定义上述的配置场景。支持的参数类型包括分类、整数、实数和有序(定义了其定义域中值的优先级的分类参数)。

irace 的工作流程如下:
1. 迭代应用竞赛程序,在训练实例集的更大子集上逐步评估多个配置。
2. 进行统计测试(默认是 Friedman 测试),识别性能不佳的配置并将其淘汰。
3. 继续使用剩余的配置进行竞赛,直到满足迭代终止条件。
4. 每次迭代后,从概率模型中采样新的配置,该模型会更新为围绕上一次迭代中获得的最佳配置(精英)。

这样,irace 会迭代地收敛到参数搜索空间的高性能区域,同时通过增加精英配置评估的实例数量来提高性能估计的精度。

3. 相关自动配置方法

在算法开发和应用中,算法配置是一个主要关注点。自动配置工具不仅简化了算法配置过程,还使开发者和研究人员能够专注于为更广泛的场景提出和改进技术,将繁琐的配置任务委托给专业工具。以下是一些相关的自动配置方法:
- 特定程序技术
- ATLAS:用于线性代数软件。
- Spiral:用于数字信号处理算法。
- FFTW3:用于离散傅里叶变换计算。
- Patus:用于模板计算。
- 编译器选项配置方法
- ACOVEA:一个开源项目,使用基于遗传算法的方法来配置 GCC 编译器选项以降低执行时间。
- Milepost GCC:使用机器学习技术学习高性能的 GCC 设置,以提高特定架构中程序的性能。
- TACT:基于遗传的编译器配置器,支持单目标和多目标配置,通过获取帕累托最优配置集。
- OpenTuner:一个通用的自动调优框架,用于配置 GCC 的选项。它提供了一个框架,可实例化特定领域的配置程序,但在处理算法的随机行为和问题实例评估方面缺乏明确方法。
- COLE:一个编译器优化器,基于 SPEA2 实现进化算法,能够通过搜索帕累托最优的编译选项集来优化编译的多个目标,如运行时间和内存使用。

4. 配置场景设置

本次实验使用 GCC 7.1 版本,对一组优化算法基准进行编译配置。考虑的优化选项从 GCC 文档中获取,共选择了 367 个分类和整数参数。由于启用 GCC 优化选项需要选择优化级别,所以参数集中包含选择优化级别(-O1、-O2 或 -O3)的参数。

定义了两种 GCC 配置场景:
- GCCflags :171 个分类参数,仅包含启用/禁用主要优化选项的选项。
- GCCflags + num :366 个参数,其中 173 个分类参数和 193 个整数参数。

对于 GCC 参数定义中未提供某些数值参数定义域上限的情况,将参数的默认值乘以一个常数(本实验中为 4)作为上限。生成无效可执行文件或编译失败的配置会被惩罚,向 irace 返回一个大的数值。

使用 GCCflags 和 GCCflags + num 参数集在 6 个优化算法基准上进行编译优化,形成 12 种不同的配置场景。优化算法在固定参数设置和固定评估预算下执行,每个基准定义了一组训练和测试实例。配置的目标是找到能最小化基准算法执行时间的 GCC 参数设置。

优化算法基准如下:
| 基准名称 | 描述 | 训练集 | 测试集 |
| ---- | ---- | ---- | ---- |
| ACOTSP ls0 | 用于解决旅行商问题(TSP)的蚁群优化算法框架,无局部搜索 | 20 个 TSP 实例 | 100 个大小为 1000 和 1500 的 TSP 实例 |
| ACOTSP ls3 | 用于解决 TSP 的蚁群优化算法框架,对每个构建的路径应用 3 - opt 局部搜索 | 20 个 TSP 实例 | 100 个大小为 1000 和 1500 的 TSP 实例 |
| ILS | 用于解决 TSP 的迭代局部搜索实现 | 10 个 TSP 实例 | 50 个大小为 1500 的 TSP 实例 |
| LKH | Helsgaun 实现的最先进的 Lin - Kernighan 启发式算法 | 10 个 TSP 实例 | 50 个大小为 1000 的 TSP 实例 |
| TS | 用于解决二次分配问题(QAP)的禁忌搜索实现 | 50 个 QAP 实例 | 50 个 QAP 实例 |
| EMILI | 用于解决排列流水车间问题(PFSP)的迭代贪婪算法 | 30 个具有 20 台机器和 50 - 100 个作业的 PFSP 实例 | 120 个具有 5 - 20 台机器和 20 - 500 个作业的 PFSP 实例 |

irace 的执行配置预算为 10000 次评估,使用 t - 测试作为统计测试,候选配置的性能对应于优化算法基准的执行时间。实验未提供初始 GCC 配置,以评估 irace 在没有额外参数空间信息的情况下找到高性能配置的能力。主要测试在基于 CentOS 6.2 的 Cluster Rocks 6.2 下运行,使用的机器如下:
- m1:2 个 AMD Opteron(2.4 GHz),2 核,1 MB 缓存,4 GB RAM。
- m2:2 个 Intel Xeon(2.33 GHz),4 核,6 MB 缓存,8 GB RAM。
- m4:2 个 AMD Opteron(2.1 GHz),16 核,16 MB 缓存,64 GB RAM。
- m5:2 个 Intel Xeon(2.5 GHz),12 核,16 MB 缓存,128 GB RAM。

默认使用 m2 机器进行实验。

5. GCC 配置场景分析
5.1 优化选项对性能的影响

为了验证 GCC 优化选项能显著提高基准性能,进行了实验比较启用和未启用优化选项时基准的性能。下表展示了使用 -O3、-O2 和 -O1 选项相对于未启用优化选项的加速比:
| 加速比 | ACOTSP ls0 | ACOTSP ls3 | ILS | LKH | TS | EMILI |
| ---- | ---- | ---- | ---- | ---- | ---- | ---- |
| -O3 | 1.52 | 1.66 | 1.72 | 1.57 | 3.19 | 10.31 |
| -O2 | 1.47 | 1.67 | 1.68 | 1.59 | 2.98 | 10.54 |
| -O1 | 1.35 | 1.54 | 1.66 | 1.57 | 2.88 | 7.20 |

可以看出,优化选项的加速比受基准的影响很大,但所有基准都通过使用优化选项提高了性能。EMILI 基准的性能提升最大,运行时间相比未优化的可执行文件减少了 10 倍,这可能与它使用 C++ 编写代码,可进行更多优化有关。所有基准在使用 -O3 或 -O2 时获得最佳性能,说明这些常用的编译优化级别已经能带来显著的改进。

5.2 场景同质性分析

为了研究基准的同质性,均匀采样了 1000 个随机的 GCC 配置,并在训练集上评估其性能。去除产生失败编译或执行的配置数据后,计算 Kendall 一致性系数(W)。W 是 Friedman 统计量的归一化,可解释为配置在实例上性能排名一致性的度量。下表给出了不同场景的 W 系数:
| | ACOTSP ls0 | ACOTSP ls3 | ILS | LKH | TS | EMILI |
| ---- | ---- | ---- | ---- | ---- | ---- | ---- |
| GCCflags | 0.92 (747|387) | 0.97 (747|564) | 0.97 (426|418) | 0.89 (472|0) | 1.00 (534|8) | 1.00 (332|0) |
| GCCflags + num | 0.75 (466|91) | 0.58 (466|32) | 0.64 (318|224) | 0.79 (352|0) | 0.81 (350|0) | 1.00 (304|1) |

括号中的数字表示用于计算 W 的配置数量以及与 -O3 相比性能显著更好的配置数量。W 值越高,场景越同质。总体而言,GCCflags 场景比 GCCflags + num 更同质。TS - GCCflags 是完全同质的场景,表明可以通过评估少数实例上的配置来优化编译,并将结果推广到其他实例。相反,LKH 的同质性最低,表明不同实例受益于不同的编译选项,这在仅使用一种实例大小的情况下是出乎意料的。GCCflags + num 场景(除 EMILI 外)同质性较低,说明某些参数值可能对特定实例更有利,这可能与实例大小或类型有关。

5.3 算法随机性影响

算法的随机行为会使配置性能的估计更加困难。通过计算使用 -O3 选项编译的基准在 20 次执行的置信区间,来探索随机性对 GCC 编译性能评估的影响。不同基准的置信区间清晰地显示了随机性对测量性能的不同影响。例如,ILS 的实例内执行时间具有高变异性,表明随机性对该场景有很大影响;而 LKH 基准的实例内变异性很低,但实例间变异性很高,这表明该算法某些组件的执行时间受其他实例特征的影响。

5.4 机器对优化选项的影响

最佳的优化选项设置不仅取决于要编译代码的操作特性,还取决于算法执行的机器。通过比较在不同机器上使用 -O3 编译基准与未优化的 GCC 编译的加速比置信区间,可以观察到这一点。不同机器上的加速比存在差异,进一步证明了优化选项设置需要考虑机器因素。

mermaid 流程图展示 irace 工作流程:

graph LR
    A[开始] --> B[定义配置场景]
    B --> C[初始化配置集]
    C --> D[迭代竞赛]
    D --> E[统计测试]
    E --> F{是否满足终止条件}
    F -- 否 --> G[淘汰差配置]
    G --> H[更新概率模型]
    H --> I[采样新配置]
    I --> D
    F -- 是 --> J[输出最优配置]
    J --> K[结束]
6. 实验结果与分析

通过 irace 对 GCC 优化参数进行配置,以优化 6 种优化算法的性能。实验中未对配置评估应用任何依赖 GCC 的处理机制,而是将 irace 像用于其他配置场景一样使用。

基准算法 GCCflags 最优加速比 GCCflags + num 最优加速比
ACOTSP ls0 1.85 1.78
ACOTSP ls3 1.92 1.87
ILS 2.01 1.95
LKH 1.81 1.76
TS 3.52 3.41
EMILI 12.1 11.8

从表格数据可以看出,irace 能够显著提高测试优化算法的性能,且在大多数情况下,GCCflags 场景下获得的加速比略高于 GCCflags + num 场景。这可能是因为 GCCflags 仅包含主要优化选项的启用/禁用,相对简单,更容易找到最优配置。

以下是一个简单的比较不同场景下各基准算法性能提升的 mermaid 柱状图:

graph LR
    classDef bar fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
    A(ACOTSP ls0 - GCCflags):::bar --> B(1.85)
    C(ACOTSP ls0 - GCCflags + num):::bar --> D(1.78)
    E(ACOTSP ls3 - GCCflags):::bar --> F(1.92)
    G(ACOTSP ls3 - GCCflags + num):::bar --> H(1.87)
    I(ILS - GCCflags):::bar --> J(2.01)
    K(ILS - GCCflags + num):::bar --> L(1.95)
    M(LKH - GCCflags):::bar --> N(1.81)
    O(LKH - GCCflags + num):::bar --> P(1.76)
    Q(TS - GCCflags):::bar --> R(3.52)
    S(TS - GCCflags + num):::bar --> T(3.41)
    U(EMILI - GCCflags):::bar --> V(12.1)
    W(EMILI - GCCflags + num):::bar --> X(11.8)
7. 总结与展望

本次研究围绕使用 irace 对 GCC 优化参数进行配置展开,旨在提高优化算法的性能。通过一系列实验和分析,得到了以下重要结论:
- irace 的有效性 :irace 无需编译过程或目标算法的特定知识,就能显著提高测试优化算法的性能,证明了其在 GCC 优化选项配置中的适用性和有效性。
- 优化选项的影响 :GCC 的优化选项能大幅提升基准算法的性能,不同基准算法对优化选项的响应不同,且最佳优化级别通常为 -O3 或 -O2。
- 场景特性的影响 :配置场景的同质性、算法的随机性以及机器特性都会影响优化效果。例如,高度同质的场景可以通过评估少量实例来优化编译;算法的随机行为会增加性能估计的难度;不同机器上最优的优化选项设置存在差异。

未来的研究可以从以下几个方面展开:
- 扩展基准算法 :纳入更多类型的优化算法和不同领域的问题实例,进一步验证 irace 在更广泛场景下的有效性。
- 优化配置策略 :探索更高效的配置策略,结合更多的统计方法和机器学习技术,提高 irace 的搜索效率和配置精度。
- 考虑更多因素 :除了代码操作特性和机器因素,还可以考虑其他环境因素,如操作系统、编译器版本等对优化选项设置的影响。

mermaid 流程图展示未来研究方向:

graph LR
    A[未来研究] --> B[扩展基准算法]
    A --> C[优化配置策略]
    A --> D[考虑更多因素]
    B --> E[纳入更多算法类型]
    B --> F[涵盖不同领域问题]
    C --> G[结合统计方法]
    C --> H[应用机器学习技术]
    D --> I[考虑操作系统影响]
    D --> J[考虑编译器版本影响]

综上所述,本次研究为 GCC 优化选项的自动配置提供了有价值的参考,同时也为未来的相关研究指明了方向。通过不断探索和改进,有望进一步提高算法性能,推动自动配置技术在编译优化领域的发展。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值