摘要

OpenMP凭借其扩展的并行功能和对急剧变化的HPC架构的支持,促使HPC应用程序开发人员社区开发并行应用程序的激增,导致严重的能源消耗问题。因此,尽管底层优化搜索空间可能会大幅增加,但是编译器开发人员在自动化方式中解决HPC应用程序的能耗问题的概念有所增加。本文提出了一种随机森林建模(RFM)方法,用于预测编译器中OpenMP应用程序的能耗。该方法使用OpenMP应用程序进行测试,例如NAS基准测试,矩阵乘法,n体模拟和模板应用,同时根据能量、问题规模和其他性能问题调整应用程序。当测试数据集的能量变化在0.024焦耳和150.23焦耳之间时,所提出的RFM方法预测代码变体的能量消耗小于0.699均方误差(MSE)和0.998 R2值。此外,还讨论了能量变化的影响、所使用的独立变量的数量以及在RFM建模过程中使用的测试数据集的比例。

研究背景

由于最近架构的范式转变,开发的HPC应用程序在应用程序开发人员的头脑中大量涌入 - 大多数CPU供应商从提高CPU时钟速度转向在芯片上添加多核。因此,考虑到机器的硬件并行性和各种其他性能问题,包括能源,应敦促应用程序开发人员编写高效的并行算法。

OpenMP以其最简单的编程方法(使用OpenMP构造)及其对各种HPC架构的支持,广泛吸引了来自不同领域的应用程序开发人员,例如高能物理,云制造部门等。简洁起见,HPC应用程序开发人员社区最好选择使用OpenMP构造编写并行应用程序[3]。

但是,由于新兴的非熟练HPC应用程序开发人员和架构应用程序不匹配,应用程序很容易导致性能问题,包括能耗问题。例如,应用程序开发人员可以开发具有过多顺序代码或太多细粒度并行代码的OpenMP应用程序。事实上,当解决特定的性能问题时,在优化解决方案方面存在权衡。有趣的是,由于混乱的架构和不同的应用要求,这些优化可能性相对增加。因此,对于编译器的自动调整机制的需求正在成为HPC应用程序开发者的强制性解决方案。

通常,可以使用预测建模解决方案来辅助编译器的自动调整机制,使得在有限执行的情况下可以在优化搜索空间中广泛覆盖解决方案。

本文提出了一种使用随机森林建模(RFM)方法的OpenMP应用程序的能量预测机制。RFM是一种基于套袋树的建模机制。拟议的能量预测机制是在印度的HPCCLoud研究实验室开发的。为了验证所提出的机制,在奥地利因斯布鲁克大学的汤姆森机器上远程进行实验后得到训练和测试数据。预测了各种问题规模的几种HPC应用,例如NAS基准测试,n体仿真,模板计算和矩阵乘法应用。简洁地说,RFM机制用于预测各种问题大小的应用的能量消耗。

能耗预测的作用

在实现规模计算的道路上,最近出现了对开发能量调整机制的需求。为了说明这一点,美国能源部计划到2022年将超大规模系统的能耗降低到20兆瓦[18]。为了实现这一目标,各种研究人员在各级计算系统中提出了几种能量减少机制。例如,在[20]中讨论了在应用级实施的节能技术。

在优选大的优化搜索空间上应用能量调整机制,其由于各种因素而出现,例如,所使用的核的数量,应用的行为,应用的性能问题等等,可能导致繁重的开销,从而导致前所未有的能源消耗。因此,如果完成合适的能量预测机制,则可以有效地减轻能量调整机制,从而可以避免执行优化搜索空间的每个可能的解决方案。

下面介绍了模型如何显着辅助自动调整工具的一些方法:

  • 查找最佳问题大小:使用最佳问题大小求解应用程序可以提高应用程序的性能。但是,如果将详尽的搜索机制应用于该过程,则为OpenMP应用程序找到最佳问题大小可能会导致各种执行要求。在大多数情况下,应用程序的问题大小在应用程序参数方面反映在其代码的迭代部分中。基于建模的解决方案可以帮助用户找到应用程序的最佳问题大小。
  • 寻找最佳硬件资源:只有在算法能够很好地扩展时,应用程序才会进行扩展。实际上,大多数HPC应用程序仅限于有限数量的处理器或线程。在考虑面向E级系统应用程序时,为OpenMP应用程序寻找线程或核心数量的最佳组合可能成为一项具有挑战性的任务 - 即,超大规模应用程序需要数千到数万个核心。可以利用为应用程序训练几组进程和线程组合来预测进程和线程的其他几种组合,同时找到最佳的硬件资源设置。
  • 寻找最佳CPU频率:在现代架构中控制CPU频率。机器的每个核心可以在用户或OS指定的不同CPU频率下工作。OpenMP应用程序的代码区域是并行或顺序的。如果OpenMP应用程序的代码区域是粗粒度的,则可以优雅地改变核心的CPU频率,从而使应用程序的能量消耗变得最小。使用能量模型可以在运行应用程序时查找核心的最佳CPU频率。
  • 寻找最佳代码变体:除了几个能量优化解决方案之外,还可以通过应用各种传统的代码优化技术来调整HPC应用程序,例如,编译器中的循环融合,循环展开,标量替换,尾部调用减少等等。由于代码优化技术在应用于整个应用程序时是大规模的解决方案,因此在应用程序中寻找最佳的代码变体选项时最好选择建模方法。