用OpenTuner进行程序调优

        编译器对于软件来说至关重要,编译的质量直接影响软件的运行效率。对编译生成的程序运行性能影响最大的就是编译器中的优化选项,但是在现代编译器中,除了最基础的-O0、-O1、-O2外,还有数百个优化选项,这些优化选项构成了2的数百次方种组合,任何一个软件开发工程师都不可能清楚地知道究竟哪些优化选项的组合能使编译出的程序达到最高运行效率。为了将寻找合适的优化选项的过程交给电脑自动完成,OpenTuner被开发了出来。

        本文首先介绍OpenTuner的基本原理,然后讲解OpenTuner的编译安装及其使用。

一、OpenTuner的基本原理

        论文原文:OpenTuner | Proceedings of the 23rd international conference on Parallel architectures and compilation

        OpenTuner是一个用于构建领域特定的多目标程序自动调优器的框架,其基本思想是通过迭代方式在编译器优化选项组合的搜索空间中找到效果较好的优化选项组合。OpenTuner首先从其搜索空间中选出一组优化选项,然后编译并运行,再根据其运行效果改进优化选项的组合,最终选出符合用户要求的优化选项组合。

        在传统的编译调优过程中,软件开发人员需要人工寻找合适的优化选项组合,此外,针对不同架构的目标机器,软件的优化过程也不一样,这使得人工调优效率低。自动调优器可以使用比人工方式大得多的搜索空间,而且在可移植性上有着天然的优势,能够显著提高程序优化的效率。在使用自动调优器后,软件开发人员从人工寻找转为提供可能的优化选项搜索空间,在软件移植方面仅需将其在不同的优化集的机器上重新运行即可。

        OpenTuner整体框架如下图所示:

         图中的搜索组件的搜索技术使用用户定义的优化选项操作器(Configuration Manipulator)来读取和写入优化选项;测量组件使用用户定义的测量函数评估候选的优化选项组合。这两个组件仅通过一个结果数据库进行通信,该数据库用于记录调优过程中收集的所有结果,并且能够并行执行多个测量。具体来说,搜索组件从数据库中读取先前的优化选项组合的测量结果(Results),据此进行迭代搜索并将得到的新的优化选项组合(Desired Results)写入数据库,然后测量组件从数据库中读取新的优化选项组合并测试其运行结果,再写回数据库。

        OpenTuner引入了通用框架来描述程序自动调优的复杂搜索空间。同时,OpenTuner将搜索技术集合的概念引入到程序自动调优中,使得多种搜索技术能够协同工作以找到最佳解。OpenTuner还提供了比传统的程序自动调优器更为复杂的搜索技术,使得程序自动调优的广泛应用能够解决更复杂的搜索问题,并且易于移植。

        论文作者通过将OpenTuner应用在了7个不同的项目中展示了其多样性,并通过16个Benchmarks展示了其有效性,OpenTuner比先前的最佳技术的效率提高了2.8倍。OpenTuner能够在规模超过10^3600的大型搜索空间中使用,同时仅需搜索全空间的2%就可以找到较为满意的结果。

二、OpenTuner的使用

        本节介绍其源码的编译及其使用方法。OpenTuner源码地址: GitHub - jansel/opentuner: An extensible framework for program autotuning

        将下载的源码包解压,进入解压后的文件夹:

cd opentuner-master

        安装OpenTuner,官方推荐使用Python3.7以上版本,这里我选择使用3.8版本。首先安装该版本的Python:

sudo apt-get install python3.8

        然后切换Python版本到3.8:

sudo rm /usr/bin/python
sudo ln -s /usr/bin/python3.8 /usr/bin/python

        此时再查看python版本验证是否更改成功

         再安装python3.8版本相对应的开发包:

sudo apt-get install python3.8-dev

        由于OpenTuner使用pip进行安装,首先安装pip工具:

sudo apt-get install python3-pip

        安装环境搭建完成后,即可开始OpenTuner的安装:

sudo pip install opentuner

        安装成功后,我们可以通过运行opentuner-master/examples/gccflags/gccflags_minimal.py脚本来验证安装结果:

cd /opentuner-master/examples/gccflags
./gccflags_minimal.py

        该python脚本实现的是对opentuner-master/examples/gccflags/apps/raytracer.cpp文件的性能优化,是OpenTuner用于学习的一个极简版。内容如下所示:

#!/usr/bin/env python
#
# Autotune flags to g++ to optimize the performance of apps/raytracer.cpp
#
# This is an extremely simplified version meant only for tutorials
#

import opentuner
from opentuner import ConfigurationManipulator
from opentuner import EnumParameter
from opentuner import IntegerParameter
from opentuner import MeasurementInterface
from opentuner import Result

GCC_FLAGS = [
    'align-functions', 'align-jumps', 'align-labels',
    'align-loops', 'asynchronous-unwind-tables',
    'branch-count-reg', 'branch-probabilities',
    # ... (176 total)
]

# (name, min, max)
GCC_PARAMS = [
    ('early-inlining-insns', 0, 1000),
    ('gcse-cost-distance-ratio', 0, 100),
    ('iv-max-considered-uses', 0, 1000),
    # ... (145 total)
]


class GccFlagsTuner(MeasurementInterface):

    def manipulator(self):
        """
        Define the search space by creating a
        ConfigurationManipulator
        """
        manipulator = ConfigurationManipulator()
        manipulator.add_parameter(
            IntegerParameter('opt_level', 0, 3))
        for flag in GCC_FLAGS:
            manipulator.add_parameter(
                EnumParameter(flag,
                              ['on', 'off', 'default']))
        for param, min, max in GCC_PARAMS:
            manipulator.add_parameter(
                IntegerParameter(param, min, max))
        return manipulator

    def compile(self, cfg, id):
        """
        Compile a given configuration in parallel
        """
        gcc_cmd = 'g++ apps/raytracer.cpp -o ./tmp{0}.bin'.format(id)
        gcc_cmd += ' -O{0}'.format(cfg['opt_level'])
        for flag in GCC_FLAGS:
            if cfg[flag] == 'on':
                gcc_cmd += ' -f{0}'.format(flag)
            elif cfg[flag] == 'off':
                gcc_cmd += ' -fno-{0}'.format(flag)
        for param, min, max in GCC_PARAMS:
            gcc_cmd += ' --param {0}={1}'.format(
                param, cfg[param])
        return self.call_program(gcc_cmd)

    def run_precompiled(self, desired_result, input, limit, compile_result, id):
        """
        Run a compile_result from compile() sequentially and return performance
        """
        assert compile_result['returncode'] == 0

        try:
            run_result = self.call_program('./tmp{0}.bin'.format(id))
            assert run_result['returncode'] == 0
        finally:
            self.call_program('rm ./tmp{0}.bin'.format(id))

        return Result(time=run_result['time'])

    def compile_and_run(self, desired_result, input, limit):
        """
        Compile and run a given configuration then
        return performance
        """
        cfg = desired_result.configuration.data
        compile_result = self.compile(cfg, 0)
        return self.run_precompiled(desired_result, input, limit, compile_result, 0)


if __name__ == '__main__':
    argparser = opentuner.default_argparser()
    GccFlagsTuner.main(argparser.parse_args())

        运行该文件的效果如下所示:

         观察运行时的界面我们可以发现,随着一次次的迭代,被优化程序的运行时间不断减少,最佳优化选项组合不断更新。

        OpenTuner会将运行时收集到的信息存储在opentuner.db/ubuntu.db数据库中,使用如下命令可查看该数据库中的内容:

sqlite3 opentuner.db/ubuntu.db 

        使用该命令会进入SQLite3数据库查看界面,用.tables命令查看数据库中存储的表格,如下图所示:

        使用.schma命令查看数据库建立时的命令,可以看到各个表格各列的信息:

        使用SELECT * FROM results WHERE was_new_best = 1; 命令查看result表格中各次最佳运行结果的详细信息。要完整输出表中的内容(含列名),使用.header on以及.mode column命令。

        根据这些迭代结果的编号如id和configuration_id,再结合前面所展示的数据库建立信息中各表格的外键,即可通过SQL命令在其他表格中查看其对应的信息。

        除了通过SQLite3数据库查看运行结果外,OpenTuner的源码包中还提供了支持数据库可视化查看的工具。有关可视化界面的内容位于opentuner/stats_app文件夹下,这部分的使用可以参考: https://www.jianshu.com/p/ac6996f41a9c

ClarkC.
关注 关注
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
opentuner_example
m0_53155317的博客
09-19 358
二进制文件可以让人轻松编写用户友好的命令行接口compile_result的内部数据run_result的内部数据是一个对象Run the following command to autotune our program(The --no-dups flag hides warnings about duplicate results and the --stop-after parameter specifies that we are running op
Python库 | opentuner-0.6.0.tar.gz
05-20
资源分类:Python库 所属语言:Python 资源全名:opentuner-0.6.0.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
opentuner: 自动化性能调优工具
最新发布
gitblog_00096的博客
03-18 397
OpenTuner: 自动化性能调优工具 OpenTuner 是一个开源的、自动化的程序性能调优框架。它提供了多种通用的优化算法,并可以针对不同类型的程序进行定制化配置,以实现更高效的性能优化。 什么是OpenTunerOpenTuner 是一个基于Python开发的自动化性能调优工具。它可以自动调整程序的各种参数,以提高程序的运行速度和效率。OpenTuner 支持各种编程语言和平台,包括 ...
opentuner:程序自动调整的可扩展框架
05-02
OpenTuner 程序自动调整已在许多领域得到证明,可以实现更好或更多的可移植性能。 但是,自动调谐器本身通常在项目之间不是很容易移植,因为使用域通知的搜索空间表示形式对于获得良好的结果至关重要,并且因为没有一种搜索技术能够对所有问题都表现最佳。 OpenTuner是用于构建特定于域的多目标程序自动调谐器的新框架。 OpenTuner支持完全可自定义的配置表示形式,可扩展的技术表示形式(以支持特定于域的技术)以及易于使用的界面,用于与已调程序进行通信。 OpenTuner内部的一项关键功能是同时使用多种不同的搜索技术,性能良好的技术将获得较大的测试预算,而性能较差的技术将被禁用。 系统依赖 可以在找到系统依赖项列表,它们主要是python 2.6+(不是3.x)和sqlite3(或您选择的数据库后端)。 在Ubuntu / Debian上,可以安装: sudo apt-get i
学习笔记1(opentuner相关知识点)
m0_65238732的博客
07-19 338
以下内容为笔者阅读论文OpenTuner: An Extensible Framework for ProgramAutotuning后得到的一些学习成果。在搜索技术和原始配置结构之间提供了一个中间层它主要负责管理一个参数对象对于搜索技术而言,配置操纵器为其提供读取数据的服务对于配置结构而言,配置操纵器对其执行修改数据的功能可以通过配置操纵器在下图中的树中增删数据。
opentunner tar包,docker load即可使用,相关的依赖已经安装完成
04-30
Program autotuning has been demonstrated in many domains to achieve better or more portable performance. However, autotuners themselves are often not very portable between projects because using a domain informed search space representation is critical to achieving good results and because no single search technique performs best for all problems.
bbo_challenge_starter_kit:应对Neurips 2020的黑匣子优化挑战的入门套件
03-21
黑匣子优化挑战此回购包含针对的入门工具包。上传提交内容。...这些示例当前包含子目录: hyperopt/nevergrad/opentuner/pysot/random_search/skopt/turbo/背景是一种流行的样本有效方法,可对目标函数进行
opentuner论文翻译
m0_53155317的博客
07-03 597
OpenTuner用于构建领域特定的多目标程序自动调谐程序OpenTuner内部的一个关键功能是同时使用各种不同的搜索技术自动调谐还提供了性能可移植性多目标自动调谐可用于在性能和准确性或其他标准(如能耗和内存使用)之间进行权衡,并提供满足给定性能或服务质量目标的程序自动调谐的三个挑战:第一个挑战是对问题使用正确的配置表示,第二个挑战是有效配置空间的大小,需要使用智能机器学习技术,通过少量的实验来寻求良好的结果。第三个挑战是配置空间的景观,如果搜索空间不连续且随机,则进化算法的性能可能会更好,还需要机器学习
np.size()和np.shape()函数
热门推荐
u011699626的博客
09-20 3万+
函数作用:计算当前数组中元素的总个数。我们可以看到,三种方法均可以获取到。函数作用:计算当前数组的形状。
OpenTuner: 自动化性能调优工具
gitblog_00094的博客
03-18 307
OpenTuner: 自动化性能调优工具 OpenTuner 是一个开源的、自动化的程序性能调优框架。它提供了多种通用的优化算法,并可以针对不同类型的程序进行定制化配置,以实现更高效的性能优化。 什么是OpenTunerOpenTuner 是一个基于Python开发的自动化性能调优工具。它可以自动调整程序的各种参数,以提高程序的运行速度和效率。OpenTuner 支持各种编程语言和平台,包括 ...
GCC编译优化选项及汇编优化实例
主要分享硬件、嵌入式软件部分知识
04-15 1690
最近在做LVGL的GUI,移植官方的SDK,然后CPU占用率竟然达到了99%,这就让整个GUI界面的反应十分缓慢。然后我开启了编译器的优化-O3,CPU的使用率降低到了50%,今天来简单介绍一下GCC的编译优化级别。编译器优化级别由命令行选项-On控制,其中n是所需的优化级别。打开优化标志会使编译器提高性能和优化代码大小,但会牺牲编译时间和部分语句的Debug功能。
编译器工具链(三)——编译优化
weixin_54911557的博客
01-11 1451
GCC和LLVM编译器提供了各种各样的优化和检测技术。编译器中的优化可以提高性能或减少代码体积,同时各种插装技术可以帮助了解系统的内部结构。本文将介绍一些常用的编译器优化。
Centos7部署个人wiki(bookstack)踩坑版
weixin_44799797的博客
01-18 3551
Centos7部署个人wiki(bookstack)安装epel-release安装nginx,启动并设置自启(如有请忽略)下载php-fpm以及所需依赖组件配置php更改php-fpm配置文件启动php-fpm并设置自启动安装mysql安装Composer安装bookstack配置bookstacknginx用户授权为 BookStack 生成唯一的应用程序密钥,并使用 PHP artisan 命令更新数据库模式配置nginx测试访问 在网上找的相关部署手册均有不完善的地方,踩了不少坑,以此文章做为部署汇
09 使用man手册页
weixin_48089507的博客
06-22 794
​ 大多数程序/配置文件/库函数都提供手册页​ 包括命令名称、语法、用途描述、选项、作者等信息​ 通过统一阅读工具man来获得这些帮助。
workerman的基本用法(示例详解)
weixin_64051447的博客
10-08 1005
具有高性能,可轻松构建快速,可扩展的网络应用程序。支持HTTP,Websocket,SSL和其他自定义协议。支持libevent,HHVM,ReactPHP。以上就是workerman的基本用法(示例详解)的详细内容。Workerman是一个异步事件驱动的。
linux shell脚本游戏之推箱子
我心如水
10-12 7922
#! /bin/sed -nf #r sokoban.sed - 2002-03-15 aur閘io marinho jargas #r ----------- #r motivated by reading the amazing Adventure (Colossal Cave) history #r #r GPL levels took from Mike Sharp
chrome java虚拟机_JATT:谷歌的Java虚拟机自动调整工具
weixin_29164081的博客
02-12 336
JATT是google的Java虚拟机自动调整工具,它是一个开源软件工具,用于优化Java虚拟机(JVM)。JATT是基于OpenTuner开发的,OpenTuner是另一个开源软件框架,用于构建域特定的自动微调器。 JATT专门用于调整HotSpot JVM,这是最常用的JVM之一。 尽管JATT主要关注于HotSpot JVM,但JATT源代码可以轻松扩展,以构建针对不同JVM实现的自动调整器...
php 打印堆栈,PHP怎么打印调用堆栈
weixin_39932479的博客
03-10 1673
在给定的PHP代码中,child_func()函数调用parent_func()函数,该函数进一步调用grandparent_func()函数,从而生成调用堆栈。推荐学习:《PHP教程》PHP打印调用堆栈的三种方法如下:方法1:使用debug_print_backtrace()函数打印调用堆栈。例:...
如何扫描网页后台地址
m0_74887243的博客
02-04 3633
后台扫描

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • EOS源码编译安装踩坑血泪史 10272
  • Ubuntu下的以太坊源码编译安装 10055
  • Java Agent介绍及其使用 9456
  • 由阶乘问题引发的关于数据溢出的讨论 2585
  • 一文读懂信息量、信息熵、相对熵(KL散度)和交叉熵 2518

最新评论

  • 一文读懂信息量、信息熵、相对熵(KL散度)和交叉熵

    qq_42434716: 最后一道题的两个值,我算出来是:2.94与0.56。不知道差异在哪

  • 一文读懂信息量、信息熵、相对熵(KL散度)和交叉熵

    德·基督山伯爵961: 作者介绍得很清晰明了

  • 使用Csmith自动挖掘编译器的Bug

    javionyang: 请问,我在生成测试用例后,运行的时候会出现长时间卡死的情况,应如何解决?

大家在看

  • 深入浅出谈C/C++中static关键字 430
  • C++入门8 构造函数析构函数顺序|拷贝构造
  • 【Linux】常见指令的使用
  • Windows: 使用PowerShell管理Hyper-V虚拟机 634
  • java并发编程 802

最新文章

  • YARPGen——挖掘编译器Bug的另一个工具
  • 使用Csmith自动挖掘编译器的Bug
  • HEALER: Relation Learning Guided Kernel Fuzzing学习笔记
2023年2篇
2022年9篇
2021年1篇
2020年13篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

深圳SEO优化公司杭州网站搭建玉溪网站优化排名报价福田企业网站制作价格汕头网站建设推荐清远百姓网标王推荐鄂州企业网站设计多少钱那曲网站改版哪家好驻马店企业网站制作多少钱南昌建设网站萍乡百度爱采购推荐汕尾网站设计报价永州百度爱采购哪家好商丘网站推广工具公司孝感营销网站哪家好布吉网站制作设计哪家好天门网站seo优化推荐南京模板推广哪家好宁德网站定制报价临沂外贸网站设计哪家好永州企业网站改版价格衡阳百度竞价包年推广多少钱垦利模板网站建设公司盐田网页设计报价宁德设计公司网站价格衡阳网站搭建哈尔滨网站搭建推荐大同网站seo优化价格南充营销型网站建设公司广东品牌网站设计扬州关键词排名包年推广多少钱歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化