没有合适的资源?快使用搜索试试~ 我知道了~
SoftwareX 7(2018)95原始软件出版物libVersioningVersioner:一个易于使用的库,用于动态生成和调用多个代码版本S. Cherubin*,G.阿戈斯塔Dipartimento di Elettronica,Informazione e Bioingegneria,Politecnico di Milano,Via G.Ponzio 34/5,I-20133米兰,意大利ar t i cl e i nf o文章历史记录:2017年5月23日收到收到修订版,2018年3月13日接受,2018年保留字:动态编译版本控制编译器持续优化a b st ra ct我们提出了libVersioningliver,一个C++库,旨在支持在HPC场景中动态生成同一计算内核的多个版本 它可以用于提供持续优化,基于输入数据或工作负载变化的代码专门化,或者以其他方式动态调整应用程序,而无需完全动态编译器的负担。该库支持多个底层编译器,但专门针对llvm框架。我们还提供了使用示例,显示了库的开销,并提供了有效使用的指导方针版权所有©2018作者.由爱思唯尔公司出版这是CC BY许可下的开放获取文章(http://creativecommons.org/licenses/by/4.0/)中找到。代码元数据当前代码版本v1.2用于此代码版本的代码/存储库的永久链接https://github.com/ElsevierSoftwareX/SOFTX-D-17-00040法律代码许可证LGPL v3使用git的代码版本控制系统软件代码语言,工具和服务使用C++,cmake,LLVM,Clang。编译要求,操作环境依赖性建议系统:Ubuntu 16.04 x86_64或更高版本。需dependencies:dl,uuid-dev.可选依赖项:llvm-4.0-dev、libclang-4.0-dev。如果有开发人员文档/手册的链接,请参阅存储库中的README.md技术支持邮箱stefano. polimi.it1. 动机和意义设计和实现高性能计算(HPC)应用程序是一项困难而复杂的任务,需要掌握几种专用语言和性能调优工具;然而,这一先决条件与当前向更广泛的用户开放HPC基础设施的趋势不兼容[1,2]。从长远来看,HPC中心员工直接支持应用程序开发的当前模式因此,有效的API和编程语言的可用性对于提供向新型异构HPC平台的迁移路径以及保证开发人员在这些平台上有效工作的能力至关重要通讯作者。电子邮件地址:stefano. polimi.it(S. Cherubin)。https://doi.org/10.1016/j.softx.2018.03.006虽然在通用场景中,简档引导的编译时代码转换可以提供足够的优化,但是在采用大数据集的HPC场景中,简档可能是不可行的。在这些越来越普遍的情况下[3],动态方法可以证明更有效。通过动态重新编译在运行时改进应用程序代码的实践被称为连续程序优化[4虽然它已经被研究了十多年,但很少有人在实践中采用它,因为它很难手动执行,并且当自动执行时,它会损害软件的可维护性。同时,自动调优既用于调优软件参数,也用于搜索编译器优化空间以获得最优解[7]。自动调优框架可以选择同一计算内核的一组不同版本中的一个,以最佳地适应HPC系统运行时条件,例如系统资源分区,只要这些版本是在编译时生成的。这些框架中很少有真正能够执行持续优化的,而那些支持它的框架也是如此2352-7110/©2018作者。由爱思唯尔公司出版这是CC BY许可下的开放获取文章(http://creativecommons.org/licenses/by/4.0/)。可在ScienceDirect上获得目录列表SoftwareX期刊主页:www.elsevier.com/locate/softx*96S. Cherubin,G.Agosta/SoftwareX 7(2018)95只有通过特定版本的动态编译器[8,9]或通过基于云的平台[10]才能这样做libVersioningOptimer(缩写为libVC)可用于使用简单的C++API执行连续的程序优化libVC允许在运行中透明地生成计算内核的不同版本的可执行代码使用libVC的连续程序优化可以通过动态启用或禁用代码转换,以及根据其他软件工具(如通用应用程序自动调谐器)的决策更改编译时参数本文的其余部分组织如下。在第2节中,我们描述了软件架构、内部API及其功能。在第3节中,我们介绍了一个预期用途的示例在第4节中,我们强调了libVC在工业和研究领域的影响。最后,在第五节中,我们得出了一些结论。2. 软件描述libVC的目标是允许在程序运行时多次动态编译C/C++计算内核,以便可以生成和调用代码的不同专用版本当编译器的最佳参数化取决于程序工作负载时,此功能特别有用。在这些情况下,在运行时在相同代码的不同版本之间切换的能力可以提供显着的好处,如[11,12]所示。实际上,在通用代码中,最好对应用程序进行概要分析,以便提前静态生成最有效的但是,在HPC代码中,执行时间通常很长,因此分析运行可能不是一个有吸引力的选择。相反,libVC允许在运行时探索和调优编译器的参数空间,而程序正在执行有用的工作。libVC将任何可以编译为目标代码的类C过程或函数视为有效的计算内核。 只有一个约束应该在计算内核上强制执行:它必须遵守C链接规则。 这意味着不应该对计算内核本身应用名称修改。在我们的模型中,编译器是用于编译计算内核的工具,而版本是传递给编译任务的配置我们假设使用确定性的参数。在这种情况下,一个版本最多生成一个可执行代码。当指定的配置无效时,不会生成可执行代码2.1. 软件构架libVC源代码在LGPLv3许可下可用它符合C++11标准,并带有配置文件,以简化使用CMake构建系统的设置。最低要求的CMake版本是3.0.2 。 构 建 系 统 会 自 动 检 查 是 否 存 在 可 选 的 依 赖 项 LLVM 和libClang,它们的版本必须大于4.0.0。如果不满足这些依赖项,则在库安装过程中会自动禁用某些功能请参见代码元数据表,以获取详细和详尽的依赖项列表软件模型图 1显示了该软件的简化UML类图。在源代码中可以识别三个主要类。最简单的类称为Option,表示每个标志允许主机应用程序与主机实现交互的接口。 libVC为编译器抽象类提供了多达三种可能的实现:SystemCom-piler,它依赖于对已经安装 在 主 机 系 统 中 的 外 部 编 译 器 的 系 统 调 用 ; SystemCom-optimizer,它是SystemCom-er的扩展,也支持外部优化工具(如LLVM optimizer opt); ClangLibCom-er,它通过ClangAPI利用编译器作为库的范例。1请注意,只有满足LLVM和libClang依赖性时,才会安装Clan-gLibcler。最后一个重要的类是Version类,它表示在特定源文件中定义的计算内核,具有给定的编译器配置。Version对象是使用选项的有序列表与所选的编译器一起编译的。它包含一个唯一的标识符、对编译器和用于编译它的选项的引用,以及对编译器在编译版本时生成的文件的引用。Version对象的配置在该对象的整个生存期内是不变的。Version类还提供了API来控制编译过程的各个阶段:可以创建一个Version对象,并将所选编译器的执行推迟到以后的阶段。2.2. 软件功能libVC提供了一个易于使用的接口,可以用来执行内核的动态编译,并将编译后的版本作为类似C的函数指针加载。libVC本身不提供任何自动选择哪个版本应该被执行。哪个版本最适合给定任务的决定留给程序员或其他自动调优框架(如mARGOt [13]或cTuning [14])定义的策略libVC有两种不同的风格:详细的低级API和简单的高级API。后者针对最常见的用例进行了优化,它们利用默认的系统编译器并且不支持任何外部优化工具,而低级API允许更细粒度的设置并支持拆分编译技术[15];因此,产生的源代码稍微更冗长。libVC的典型用法涉及不同的阶段。第一个任务必须是声明和初始化版本无关的工具,如编译器和版本构建器,它们是帮助对象,旨在正确设置版本配置。低级API允许程序员定制一个或多个API实现。高级API公开了一个特殊的函数来透明地执行这个任务;在整个进程生命周期中只需要调用一次之后,可以继续进行版本配置。程序员可以通过使用低级API动态地伪造和排列Option,设置所选择的编译器,操纵文件名和内核名来识别要编译的代码版本构建器是允许这种低级设置的组件。一旦Versionbuilder的字段被填充,它就可以最终生成一个Version对象。高级API接收所有这些参数,并在单个函数调用中生成Version对象高级API将配置限制为一次一个版本,而低级API允许并行配置多个版本。一旦一个Version对象完成,它就必须被编译。编译任务由程序员通过专用API激活。当它涉及到分裂编译技术时,它可能会触发多个子任务。在没有编译错误的情况下,无论使用的是哪个API,在这个阶段的最后,libVC都会生成一个二进制共享对象。从这个相同的共享和传递给LibVC的参数,以便编译一个计算内核的版本 这个抽象类定义了1个http://clang.llvm.org/docs/Tooling.html。S. Cherubin,G.Agosta/SoftwareX 7(2018)9597Fig. 1. libVC的简化UML类图。对象libVC加载一个函数指针符号,它指向内核。目标内核可能包含其他文件或引用外部符号。libVC将充当编译器调用,并将尝试根据给定的编译器和链接器选项解析外部符号。libVC将编译参数的解析推迟到运行时。在设计时唯一需要的信息是内核的原型,它必须用于正确的函数指针转换。libVC还提供了钩子来支持对编译版本的跟踪和版本控制3. 说明性实例利用libVC可以通过动态编译进行广泛的优化应用。官方资源库2在测试文件中提供了一些使用示例。在本节中,我们将展示并讨论通过libVC执行的连续程序优化的一般用例。清单1演示了计数排序算法对数据工作负载的动态适应特别地,计数排序实现是通过每次要排序的数据的范围的最小值和最大值改变时当在编译时知道数据范围的最小值和最大值时,可以更有效地执行数组分配和循环优化清单1显示了libVC编译流程的几个阶段。在main函数中,在使用libVC之前需要初始化这是在第40行使用一个简单的API调用完成的从第8行到第20行,我们看到了如何为动态编译配置一个新的Version下面的行(22可以注意到第69行中对动态编译内核的调用,这与对静态链接内核的调用(第53行)非常相似作为概念证明,我们通过比较静态链接内核与同一内核的动态编译版本的求解时间,测试了使用libVC实现的连续程序优化的好处,如清单1所示。我们使用相同的编译器和相同的优化级别来编译静态链接和动态编译的内核使用清单1中代码的完整项目可以在github上找到3我们运行这个例子来对一个10亿个32位整数的数组进行用于执行实验的平台是一个超级计算机NUMA节点,该节点具有两个Intel Xeon E5-2630 V3 CPU(@2.4 GHz),在双通道内存配置上具有128 GB的DDR4内存(@1866 MHz)。表1显示动态编译的内核总是比静态链接实现的性能更好。我们将待排序数据范围的最大值和最小值之间的差值定义为范围大小。我们观察到一个重要的加速时,范围大小小于8192个可能的值。在这些情况下,加速的主要部分来自动态编译内核中更有效的数组内存分配我们还注意到,2https://github.com/skeru/libVersioningCompiler。3https://github.com/skeru/countingsort_libVC。98S. Cherubin,G.Agosta/SoftwareX 7(2018)95−−−−∗−−−−- −∗18−−清单1:使用libVC高级API对静态链接的内核执行计数排序,并对同一内核的动态编译版本进行基准测试/打开/关闭l ib版本控制器 高水平 API 报头 第一卷#include“版本控制程序/U t i l s。HPP”23/打开/关闭定义内核签名4typedef 虚空 (std::vectorint32_t> array);56vc::version_ptr_t getDynamicVersion(int32 _t min,int 32_t max){7/打开/关闭版本配置使用lib VCs t ar t8constSTD::stringkernel_dir =PATH_TO_KERNEL;9constSTD::stringk e r n e l_f i l e = kernel_dir+“kernel. cpp”;10const STD::stringfunctionName =“vc_sort“;11constvc::op t_l i s t_t op t_l i s t={12vc::make_option(“−O3”),13vc::make_option(“−std=c++11“),14vc::make_option(“−I“+kernel_dir),15vc::make_option(“−D_MIN_VALUE_RANGE=”+std::to_string(min)),16};vc::make_option(“−D_MAX_VALUE_RANGE=”+std::to_string(max)),17vc::version_ptr_t version = vc::create Version(k e r n e l_f i l e,functionName,o p t_l i s t);19/打开/关闭版本配置使用11bVC端2021/打开/关闭版本汇编第22页kernel_t f =(kernel_t)vc::compileAndGetSymbol(version);23I f (f){24返回版本;2526/打开/关闭版本编译结束27returnn u l lp t r;282930int main(intargc,char constargv [ ]){31const std::vector > data_range ={32std::make_pairint,int>(0,256),33std::make_pairint,int>(0,512),34std::make_pairint,int>(0,1024),35};36const尺寸_tdata_size =100000000;3738//i nit i a l i z e l ib Versioning编译器39vc::v c_u t i l s_i n i t();4041为 (const 汽车 range:data_range){42TimeMonitor time_monitor_ref;43TimeMonitor time_monitor_dyn;44TimeMonitor time_monitor_ovh;4546/打开/关闭运行参考版本s t i c a l l y l inked47对于(s ize_ti = 0; i <= 0; i ++){48/打开/关闭产生工作量49autowl = WorkloadProducerint32_t>::get_WL_with_bounds(range.f i r s t,范围。第二次会议);50const 汽车 Meta = wl .getMetadata();time_monitor_ref.sort();52sort(wl.数据,Meta。minVal,Meta。maxVal);//c a l l reference53time_monitor_ref.return();545556/打开/关闭测量开销的制备一个新版本s t ar t57时间监视器sort();58autov = getDynamicVersion(range. f i r s t,范围。第二次);59核tmysql =(kernel_t)v >getSymbol();60时间监视器 return();61/打开/关闭测量开销的制备一个新版本结束6263/打开/关闭运行动态动态编译的版本64对于(s ize_ti = 0; i <= 0; i ++){65/打开/关闭产生处理工作量66autowl = WorkloadProducerint32_t>::get_WL_with_bounds(range.f i r s t,范围。第二次会议);67时间监视器动态sort();68my_sort(wl . data);/ / ju s t 一 c a l l 到 函数指针69时间监视器动态return();7172/打开/关闭考虑平均解决时间73std::cut<
下载后可阅读完整内容,剩余1页未读,立即下载
cpongm
- 粉丝: 4
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- BSC关键绩效财务与客户指标详解
- 绘制企业战略地图:从财务到客户价值的六步法
- BSC关键绩效指标详解:财务与运营效率评估
- 手持移动数据终端:常见问题与WIFI设置指南
- 平衡计分卡(BSC):绩效管理与战略实施工具
- ESP8266智能家居控制系统设计与实现
- ESP8266在智能家居中的应用——网络家电控制系统
- BSC:平衡计分卡在绩效管理与信息技术中的应用
- 手持移动数据终端:常见问题与解决办法
- BSC模板:四大领域关键绩效指标详解(财务、客户、运营与成长)
- BSC:从绩效考核到计算机网络的关键概念
- BSC模板:四大维度关键绩效指标详解与预算达成分析
- 平衡计分卡(BSC):绩效考核与战略实施工具
- K-means聚类算法详解及其优缺点
- 平衡计分卡(BSC):从绩效考核到战略实施
- BSC:平衡计分卡与计算机网络中的应用
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功