没有合适的资源?快使用搜索试试~ 我知道了~
软件X 12(2020)100565原始软件出版物Clava:使用LARA的João Bispo,João M.P.卡多佐波尔图大学工程学院/INESC-TEC,R.博士Roberto Frias s/n,4200-465 Porto,葡萄牙ar t i cl e i nf o文章历史记录:收到2019年收到修订版2020年5月10日接受2020年关键词:源到源C/C++Lara编译器a b st ra ct本文介绍Clava,一个基于Clang的源到源编译器,它接受用LARA编写的脚本,LARA是一个基于JavaScript的DSL,具有用于代码查询、分析和转换的特殊结构。Clava通过提供更方便和灵活的方法来分析、转换和生成C/C++代码,并为捕获运行时行为的构建策略提供支持,从而改进了Clang我们介绍Clava框架,它的主要功能,以及如何使用它。此外,我们表明,Clava是足够强大的分析,仪器和测试一组大型的C/C++应用程序代码,如GCC。©2020作者由爱思唯尔公司出版这是CC BY许可下的开放获取文章(http://creativecommons.org/licenses/by/4.0/)中找到。代码元数据当前代码版本v4.2.7用于此代码版本的代码/存储库的永久链接https://github.com/ElsevierSoftwareX/SOFTX_2019_209合法代码许可证Apache-2.0使用git的代码版本控制系统使用Java、C++、Clang/LLVM、LARA的编译要求、操作环境依赖性Java 11如果可用,链接到开发人员文档/手册http://specs.fe.up.pt/tools/clava/doc/问题支持电子邮件jbispo@fe.up.pt软件元数据当前软件版本v4.2.7此版本可执行文件的永久链接http://specs.fe.up.pt/tools/clava_v4.2.7.zip合法软件许可证Apache-2.0计算平台/操作系统x86:Ubuntu,CentOS/Fedora,MacOS,Windows; ARM 7:Ubuntu安装要求依赖关系Java 11如果可用,请链接到用户手册-如果正式发布,请包括对https://web.fe.up.pt/~specs/projects/antarex/book/DSL_and_Source_to_Source_的引用参考书目编译the_Clava_LARA_Approach.pdf问题支持电子邮件jbispo@fe.up.pt1. 动机和意义可以说,权衡是工程学的基石之一。在编写软件时,有许多权衡需要考虑。*通讯作者。电子邮件地址:jbispo@fe.up.ptwww.example.com Bispo)。https://doi.org/10.1016/j.softx.2020.100565例如,代码可以被编写为模块化或高效的,对于给定平台是通用的或专用的,以节省内存或能耗。没有此外,与业绩和效率有关的变化2352-7110/©2020作者。 由Elsevier B.V.出版。这是一篇开放获取的文章,使用CC BY许可证(http://creativecommons.org/licenses/by/4.0/)。可在ScienceDirect上获得目录列表SoftwareX期刊主页:www.elsevier.com/locate/softx2J. Bispo和J.M.P. Cardoso / SoftwareX 12(2020)100565通常需要分析步骤以及若干测试和假设分析步骤。这就转化为一个开发循环,在这个循环中,代码被修改、编译和执行,这通常是手动的、容易出错的、耗时的。源到源编译器可以是用于生成和管理多个代码版本的有价值的工具,并且可以实现诸如插装、代码转换(例如,循环转换)和代码重构。特别是,C/C++语言缺乏功能(例如,全面的反射支持),源到源编译器可以补充。对于一个源到源编译器成功地处理自定义任务,重要的是它提供了一个易于使用的可编程接口,允许开发人员实现其策略。直接编程编译器(例如,Clang、GCC)可能需要大量的工作,并且最近的方法已经提出使用耦合到源到源编译器的领域特定语言(DSL)领域特定语言的一个优点是,它们有可能以更简洁、更清晰的方式表达领域问题的解决方案。这还可以减少错误或低效的习惯用法,并使代码生成更高效。不好的一面是,DSL引入了必须学习一门新语言的需求, 不像本机库或编译器支持的扩展那样集成在编译工具流中。尽管如此,DSL已经被证明可以指导编译流程[2,3],并描述用于指导源代码到源代码编译器的编译器策略。有无数的源到源编译器与distin,识别特征,主要是关于所支持的代码转换和所接受的输入编程语言 。 例 如 , Cetus [4] 支 持 ANSI C , ROSE [5] 支 持 C , C++ ,Fortran,OpenMP和UPC,PIPS [6]支持C和Fortran,Insieme [7]支持C,并计划支持C++。关于向用户和开发者展示应用特定策略和/或定义他们自己的策略的机制的能力,这些方法通常集中在特定目标上。例如,CHiLL [8]是一种DSL,用于指定预定义的转换和约束序列,然后将其应用于输入应用程序源代码。关于插装和代码扩展和修改,面向AOP的编程(AOP)方法,如AOP C++ [9],可以提供一些所需的功能。 第一种解决更灵活方法的方法是Harmonic+编译器[10],使用AOP启发的LARA DSL和ROSE框架。最近,Clava被提议作为C/C++1的源到源编译框架,允许开发人 员 使 用 LARA DSL 表 达 分 析 和 转 换 策 略 [11] 。 这 种 基 于JavaScript的DSL提供了执行代码分析和转换的更简单方法的以前的方法,并介绍了一种新的方法,指定的策略,捕捉运行时的行为,使编译和执行的源代码从同一DSL脚本中的转换指定。虽然Clava已经在以前的论文中使用,例如,编译器标志的阶段排序[12],运行时自适应和自动调优[13],以及通过OpenMP的自动并行化[14],本文是第一个描述完整框架的出版物,并向感兴趣的用户提供。为了清楚地显示Clava+LARA的能力和成熟度,我们提出了新的结果,这些结果是在一组大型复杂程序的源代码上应用Clava后得出的(例如,GCC)。本文的结构如下。第2节介绍了框架及其最相关的功能,第3节展示了一些说明性的示例以及其他研究人员如何使用Clava,第4节介绍了几个实验,包括压力测试和提取运行时信息的策略,第5节总结了本文。1 Clava还支持OpenCL代码,以及混合C/C++和OpenCL的软件应用程序。2. 软件描述Clava是一个C/C++的源代码到源代码编译框架,构建在LARA框架之上[11,15],并且能够应用LARA语言编写的本节描述了这个框架,介绍了LARA语言,并展示了一些可用的特性。2.1. 棒形骨架Clava的开发始于2016年初,在由Hori- zon 2020计划资助的ANTAREX欧盟项目[15]的背景下,作为系统地改进高性能计算(HPC)背景下使用的C/C++应用程序的一种方式。图1介绍了Clava的三个通用用例,这些用例在Clava用户开发的工作中得到了实践观察。在用例Reusable Strategies中,相同的LARA策略被应用于多个应用程序。这表示可以在策略中编码领域知识的情况(例如,循环并行化[14])。用例自定义定向性将不同的策略应用于相同的代码,以便获得原始代码的不同版本(例如,使用OpenMP或OpenCL并行化)。最后,设计探索利用参数化策略,并在循环中的相同代码上应用具有不同参数值的相同策略,以便探索代码的不同版本(例如,不同精度的变量类型的探索[16])。图2显示了Clava框架的框图,它由三个主要部分组成:1)LARA引擎; 2)Clava Weaver引擎; 3)C/C++前端,其中包含Clava AST转储程序和Clava AST加载程序。LARA框架是用Java编写的,其重点是某些任务和应用程序需求(例如,依赖于目标的优化、自适应行为)可以与定义程序功能的源代码分开指定。该框架提供LARA解析器和解译器(即,LARA引擎),它执行LARA脚本,这些脚本表达针对应用程序需求的任务或策略。这些脚本然后作为编译步骤应用于应用程序源代码。Clava Weaver引擎负责提供有关C/C++的信息,并根据LARA策略的执行来维护应用程序源代码的更新的内部表示。织入器在LARA代码执行和输入C/C++源代码之间建立连接。C/C++前端将输入应用程序的源代码转换为一个抽象表示,即Clava Ab树(AST),它可以由Clava Weaver操作Clava AST Dumper是一个C++应用程序,它使用Clang的未修改版本作为库来解析C/C++程序。[17]第17话用于C语言家族的语言的生产质量前端和编译器(例如,C、C++、OpenCL)。2Clava AST转储程序解析C/C++程序的源代码,并生成转储文件包含有关代码的语法和语义信息,然后Clava AST Loader使用这些信息来构建与原始源代码等效的Clava ASTClava AST与Clang的内部AST非常相似,它进行了修改和扩展,允许基于AST的转换,并能够从AST生成源代码这种能力支持基于AST的源到源,并允许我们执行某些类型的转换,这些转换对于Clang基于AST的函数内联)。2 由于Clang被用作解析器,Clava可能支持与Clang相同的语言(例如,CUDA)。J. Bispo和J.M.P. Cardoso / SoftwareX 12(2020)1005653Fig. 1. 通用Clava用例。2.2. Lara语言图二、 Clava框架顶层结构和编译流程图。这个例子表明,在LARA中以紧凑和干净的方式表达源代码修改是可能的。比如说,LARA语言[10,11,18]混合了声明式风格,以查询输入程序代码,以及命令式风格,将动作应用于每个代码元素(例如,在代码元素之前添加监控代码)。该语言扩展了ECMAScript5规范3中的几个关键字和语法结构。LARA的主要模块是方面。方面类似于函数,并且是可以使用DSL特定构造(例如select)的地方LARA脚本可以包含任意JavaScript代码,但是,DSL构造不能在方面之外使用,例如,在JavaScript函数中。 图 3显示了一个使用以下LARA关键字的方面的示例:aspectdef、select、apply和condition。关键字aspectdef(第1行)标记了一个方面的开始。如果目标源代码(例如,C++程序)在执行.lara文件之前已经在配置中指定,Clava隐式地解析并构建在LARA策略的执行期间可访问的AST表示。关键字select(第2行)允许指定代码中的点(例如,函数,循环)来分析或转换。选择是分层的并且类似于查询,例如,select function.loopend选择目标源代码中所有函数内部的所有循环。apply块(第3 - 6行)类似于for循环,它迭代前一个选择的所有点。代码中的每个特定点,在本文中简称为连接点4,可以在应用块内部通过前缀美元符号(即,$)设置为连接点的名称(例如,$loop)。每个连接点都有一组属性,可以访问这些属性(例如,$loop.line),以及一组可用于转换或添加新代码的动作插入第5行)。最后,condition关键字(第7行)可用于在连接点选择(select语句的结果)上过滤连接点总结,图的示例。 3选择foo函数内部的所有循环,对于每个循环,它在源代码到源代码编译时打印源代码中循环所在的行以及是否是最内层的循环,并在循环之前插入代码' / / B e f o r e l o o p ' 。直接使用Clang作为C++库来实现类似的示例可能需要100多行代码,并且学习的API要复杂得多5Clava依赖于定义可用于给定目标语言的连接点的语言规范( 例 如 , 函 数 , 循 环 ) , 如 何 选 择 它 们 ( 例 如 ,function.loop),以及哪些属性和动作可用于每个连接点(例如,$function.name)。Clava Weaver负责定义C/C++的语言规范,LARA框架在每个LARA方面的执行期间访问该 Clava Weaver还负责映射由选择获得的连接点到AST中的等效节点,并用于实现属性和操作(见图1)。 4).2.3. Clava特征本节介绍Clava框架的一些功能和支持工具。2.3.1. 安装和平台要求Clava框架主要是用Java编写的,有一部分是用C++编写的,它使用Clang。Java代码是独立于平台的,可以在任何安装了最新Java运行时的计算机上运行。Java代码可以从头开始编译使用自定义构建配置,或者可以下载预编译的JavaScript文件。6C++代码是一个独立的可执行文件,需要为每个想要运行Clava的平台进行编译,并且是执行Clava框架所必需的。此可执行文件将Clang的一部分作为库嵌入,为了编译可执行文件,需要为目标平台编译Clang(或提供Clang对象文件)。由于这个编译过程可能是复杂和耗时的,我们为几个平台提供了独立可执行文件的预编译二进制文件。Clava第一次执行时,自动下载正确的二进制文件。目前,Clava提供预编译的3 增加了对最近规范的一些特性的支持,例如for.的声明。4 在面向方面编程(AOP)术语中,它们通常称为连接点阴影[19]。5 使用Clang插入代码的类似示例可以在这里找到:https://github.com/eliben/llvm-clang-samples/blob/master/src_clang/tooling_sample.cpp。6 https://github.com/specs-feup/clava/tree/master/ClavaWeaver网站。4J. Bispo和J.M.P. Cardoso / SoftwareX 12(2020)100565图3.第三章。LARA文件的简单示例。图四、方 面 、连接点、Clava AST和输入源代码之间的映射。适用于Windows、Ubuntu、CentOS/Fedora和MacOS的x86可执行二进制文件,以及适用于Ubuntu的ARMV7可执行二进制文件。对于Linux平台,我们提供了clava-update,一个安装和更新脚本。Clava框架目前提供了三个工具,clava(编织器),clava-doc(见2.3.3节)和clava-unit(见2.3.4节)。除了这些工具,它还安装了CMake7Clava的模块(参见第2.3.2节)。最后,我们开发了一个在线版本的Clava,其中包含几个示例,用户可以立即在有限的上下文中测试该工具。8这个在线版本是有趣的初步用户体验,同时决定选择安装完整的框架。2.3.2. CMake集成由于CMake [3]是一种流行的支持C/C++编译的构建管理工具,Clava框架通过CMake模块9提供集成,使应用程序源代码树上的LARA脚本。此模块允许指定在编译代码之前应用的自定义分析和转换步骤模块包ClavaConfig检查Clava依赖性,如果未安装则下载Clava编织器可执行文件,并向CMake添加新功能(例如,clava_weave)。2.3.3. 文档生成器我们为LARA DSL提供了一个独立的文档生成器LaraDoc。它接受LARA代码作为输入,并根据源代码文件.我们采用了JSDoc注释10,并添加了LARA特定的注释(例如,@aspect)。LaraDoc是Lara框架的一部分,独立于Clava。我们添加了clava-doc实用程序,它生成考虑Clava API的文档。Clava标准库的Clava文档使用此工具生成,可在线获取(参见第2.4节)。7 https://cmake.org/网站。8 http://specs.fe.up.pt/tools/clava/网站。9 https://github.com/specs-feup/clava/tree/master/CMake网站。10 http://usejsdoc.org/网站。2.3.4. 测试框架Clava包含一个用于执行单元测试的工具 图 5显示了包含两个单元测试的LARA文件。LARA单元测试是LARA方面或函数,在方面或函数之前的注释中使用标记@test进行注释。如果在测试执 行 期 间 没 有 抛 出 异 常 , 则 测 试 通 过 , 否 则 失 败 ( 即 ,TestFail())。执行后,clava-unit生成一个报告(见图1)。 6)。2.3.5. 在源代码通过使用源代码中的杂注clava数据和LARA中的属性数据,可以将源代码中的信息传递给Clava。 图 7显示了一个示例,我们使用此杂注来注释函数并定义两个键/值对,分别使用键aNumber和aString以及值0和'aString'。值可以是任何有效的LARA代码。 在注释源代码之后,可以使用属性数据访问这些信息,如图所示。8.第八条。2.4. 内置动作和clava APIClava提供了与某些连接点相关联的内置操作,可以直接从LARA代码中调用 表1显示了内置操作的一些示例。某些操作可用于所有连接点(例如, 复制),但是一般地,每个连接点具 有 其 自 己 的 动 作 集 合 ( 例 如 , inline for calls ,interchange for loops)。 一支持的操作的完整列表可在线获得。11LARA还支持import关键字,以便为LARA策略启用基本模块化。例如,我们使用导入特性为LARA框架和Clava开发了一个标准库。表2显示了Clava提供的API的一些示例。LARA行引用了与目标语言无关的类的示例,并且在其他LARA编译器中可用。Clava行是Clava专用的类的示例,通常与C/C++源到源任务相关。Clava API的全面文档包括可在线获取。1211 http://specs.fe.up.pt/tools/clava/language_specification.html网站。12 http://specs.fe.up.pt/tools/clava/doc/网站。J. Bispo和J.M.P. Cardoso / SoftwareX 12(2020)1005655图五、 LARA测试文件包含两个 单元测试。见图6。 clava单元测试报告示例。图7.第一次会议。用杂注clava 数据注释的C/C++源代码示例。2.5. 其他功能图8.第八条。使用属性数据的LARA代码示例。OpenCL内核并适配C/C++主机代码中的相应调用);Clava提供以下杂项功能:并行解析- Clava支持并行解析源文件。这使我们能够大大加快包含大量源文件的项目的解析时间;混合C/C++和OpenCL项目-可以在同一个Clava编译项目中包含C/C++和OpenCL文件。在这种情况下,所有文件都成为AST的一部分,可以编写需要关于不同类型文件的信息的策略(例如,更改参数,3. 说明性实例本节介绍了一组可以由Clava执行的LARA策略的示例,以及Clava用于解决特定问题的几个用例3.1. 仪表插装是源到源编译器的常见用例,可用于收集运行时数据或添加日志记录信息。··6J. Bispo和J.M.P. Cardoso / SoftwareX 12(2020)100565表1Clava内置操作的示例3.3. 用例Clava被设计成一个非常容易访问的C/C++代码分析和转换框架,并具有广泛的应用范围。它已被用作促进科学研究成果的框架,例如:编译器标志的相位排序和相位选择的探索[12]使用OpenMP prag- mas实现for循环的自动并行化[14]高性能计算(HPC)应用程序的性能调优[13]• GPU上OpenCL内核的混合精度调优[16]$callinlinecurrent call with call to wrap函数内联此调用• HDF5序列化的自动代码生成[20]$函数clone函数在程序中的重命名副本newCall为此函数创建一个新的调用节点此循环一些学生也在课堂作业和实习中使用或正在使用Clava,并探索了内存布局优化,代码特征提取,性能建模,13和设计空间探索。14$looptile表2而第二个给定的循环将循环平铺到该循环4. 影响我们相信Clava可以成为一个有用的编译器框架,Clava API示例API类描述IO与文件相关的基本I/O功能平台有关平台的信息广泛的C/C++用户和开发人员,从专家,可以编写自己的自定义LARA脚本,用户可以轻松地应用现有的LARA脚本(例如,使用CMake插件)。为了简要地展示Clava编译器的影响,我们Lara执行编译器(例如, 是Linux吗?)CMaker将当前AST编译为可执行程序ProcessExecutor启动命令行进程循环的自动并行化策略,使用我准备了三个例子:一个压力测试,处理大程序;一个界面的演示,帮助执行可重复的实验与Clava;和一个实验,转换,编译和执行源代码从Clava。Clava格普罗费尔JMP [14]编译当前AST并运行可执行文件使用gprof profiler所有实验都在运行Ubuntu的计算机上完成16.04 LTS(64位),配备两个Intel Xeon E5-2630 v3 CPUHDF5自动为C++结构和类生成HDF5包装器[20]图 9显示了LARA代码,用于检测最外层的循环,以便记录它们何时执行,并获得有关它们执行多长时间以及消耗多少能量的运行时信息。第1-3行第11行选择最外面的所有循环(即,不在另一个循环内的循环),并为每个循环创建一个基于其文件,函数和等级的id(第13行),在循环代码之前插入 在程序执行期间,当执行循环时,将打印消息(第14行),并使用循环id作为标签来测量循环的执行时间和能量消耗(第153.2. 代码的转换可以改进应用程序的某些属性(例如,执行时间)。 图图10示出了执行循环交换的LARA脚本,即,交换两个嵌套循环的顺序。这种技术可以用来确保内存访问的顺序更接近数据在内存中的布局,从而提高数据访问的局部性。第7行选择两个循环,它们是循环嵌套的一部分,(@2.40 GHz)和128 GB DDR4 RAM。程序是用GCC 7.4.0和-O3编译的。4.1. 压力测试在本节中,我们将练习几个Clava功能,例如解析、插装和代码生成。为了给Clava提供压力测试,我们收集了一些具有大量代码行的应用程序。我们使用了来自两个来源的基准测试,NAS并行基准测试[21]和Stephen McCamant15 在实验中,我们自动测试每个基准的源代码,以在运行时生成动态调用图(DCG)。执行时间是在丢弃第一个结果后平均执行30次,以预热Java虚拟机。的可以在线获得示例16,并且可以复制所有示例,通过调用一个Clava命令得到结果表3给出了基准测试的特征,以及有关Clava执行和应用程序在插装后生成的图形的信息。第一列,C代码行,显示每个程序的大小,以总行数表示,包括注释和空白行。绝大多数基准测试程序都超过了1000行,最大的基准测试程序gcc超过了75万行。为了提供一个不依赖于代码格式的程序复杂性的度量,我们包含了列AST节点,每个都有一个名字($lo和$li)。 如果环在里面具有给定名称的函数,并具有预期的控制变量(第9-11行),执行互换(第12行)。由于LARA代码接受输入参数,因此它可以用作更复杂LARA方面的构建块,例如,自动探索程序循环的几个互换组合13 https://github.com/joseloc300/AutoParSelector网站。14 https://github.com/specs-feup/LAT-Lara-Autotuning-Tool网站。15 http://people.csail.mit.edu/smcc/projects/single-file-programs/网站。16 https://github.com/specs-feup/clava-examples/tree/master/2019_Stress_Test.··连接点行动描述分离从树所有副本创建此节点的树外副本setValue设置节点的给定属性的值重建重新解析当前AST,转换文字代码进入AST节点推复制当前AST并将其推送到$程序AST堆栈顶部流行丢弃AST堆栈顶部的AST重建重新分析此文件$fileaddGlobal将全局变量添加到此文件写将此文件的代码写入给定的文件夹包裹物使用此调用创建新函数,替换·J. Bispo和J.M.P. Cardoso / SoftwareX 12(2020)1005657图9.第九条。 用于代码插装的LARA脚本。图10个。 用于循环交换的可参数化LARA脚本。显示了分析代码后Clava AST中的节点数。Clava成功解析了所有基准测试,包括最大的应用程序,解析后生成了包含200多万个节点的AST在AST的插装和代码生成之后,所有的基准测试都成功地编译和执行了。在执行时,每个基准生成一个点格式的图,其中包含执行的相应动态调用图。列前端显示了解析输入代码和加载AST所花费的时间(即,图中的Clava AST卸料机和Clava AST装载机。Weaving列显示了为生成动态调用图而对代码进行插装所花费的时间。在大多数情况下,Clava插入的代码行数列C行差)的范围从数百行到数千行。对于最大的应用,手工进行这种仪器测量是不切实际的执行时间似乎随着AST节点的数量而线性增加,在所有情况下,解析时间都占主导地位,除GCC外,所有示例的检测时间都小于1 s。本实验的目的是证明Clava框架的效率和鲁棒性。所有示例的仪表化版本在执行时生成动态调用图,图的大小从十几个节点到近200个节点不等4.2. 基准包装配置、机器设置、文件组织)可能难以正确复制。Clava框架提供了BenchmarkSet和BenchmarkInstance接口,它们可以打包一组基准,这样前面提到的繁琐过程就可以被一个简单的导入和一个简单的API所取代。Clava已经支持在LARA脚本中指定程序应该如何加载、解析、编译和执行。基准打包进一步提高了抽象级别。图图11显示了一个LARA示例,该示例使用NAS基准的打包版本。17示例包含两个方面,NasTest,这里显示的只是为了演示内部执行流,以及NasTestSimpler,它提供了一种更简单的使用基准集的方法。首先,基准集被导入(第1行)并实例化(第5行)。基准集表示一组基准和相应的输入,可以配置(第6-7行)。在配置之后,可 以 获 得 将 被 执 行 的 所 有 基 准 - 输 入 组 合 的 列 表 函 数getThreshold()和Threshold在基准实例上执行(第9在加载了基准测试实例(第10行)之后,代码就可以作为Clava中的AST使用,并且可以应用任何代码分析或转换(第11行)。要执行需要运行时信息的分析,可以编译(第12行)和执行(第13行)基准,并解析其输出。在加载下一个基准实例之前,应该关闭当前实例(行分析、转换和测试一组基准可以需要非平凡的设置工作(例如, 定义输入,编译器17https://github.com/specs-feup/clava/tree/master/benchmarks/NAS。8J. Bispo和J.M.P. Cardoso / SoftwareX 12(2020)100565表3C压力测试结果。基准测试原始代码Clava执行调用图(已生成)C代码行AST节点C线差异前端(ms)摆动(ms)节点边缘NAS_EP5711 621107562101720NAS_IS7771 6968657991415NAS_FT1 1514 672154867162934NAS_CG1 2673 561128675142023NAS_MG1 7497 418225947242737NAS_SP3 16523 8871862 010753140NAS_LU3 74227 5092142 3001013137NAS_BT3 79832 4052132 5041163046bzip26 99834 8171 5082 63114678103gzip8 60723 9441 4541 8581237699奥根茨58 413323 1444 30529 4137352121GCC753 8202 630 805184 632177 51914 64119327614)丢弃基准并恢复AST的原始状态。BenchmarkSet实现了一个生成器函数,该函数在迭代基准测试实例时执行所需的内务处理任务直接设置在一个为...的(第21行),我们不需要担心加载和关闭基准实例。execute()函数还负责编译代码,如果它还没有被编译。基准测试实例还提供函数getKernel(),该函数返回基准测试代码中执行主要计算的区域(例如, 在初始化和预热之后 , 在 结 果 处 理 之 前 ) , 并 且 我 们 通 常 想 要 测 量 。 在NASbencharmks的情况下,为了识别内核,我们手动添加了一个#pragma内核之前的区域,其中由计时器分隔,最初在基准测试中。如果定时器在for循环之间,则将杂注直接插入循环之前;否则,如果定时器在语句列表之间,则我们创建一个新的作用域并将杂注插入作用域之前。4.3. 代码区域在这个例子中,我们展示了Clava的功能,以实现和测试代码。具体来说,我们仪器,编译和执行NAS基准,为了计算,对于每个内核和给定的输入,可重复的估计执行操作的数量。这样的估计对于分析应用程序可能是有用的,并且可以补充分析结果。然而,我们注意到,由给定处理器实际执行的操作的精确测量将需要在处理器级别上计数操作,并且高度依赖于编译器、在何处使用编译标志以及在何处执行程序的处理器等。图12显示了实现完整示例的LARA脚本。与前面的示例一样,该脚本从导入NAS基准集(第2行)开始,创建一个新实例(第7行),并对其进行配置(第8行)。然后LARA脚本迭代所有基准实例(第9行)。对于每个基准测试实例,都会创建一个新的OpsCounter,它用于检测基准测试的代码,以计算基准测试内核中的操作(第11行),并在内核执行后打印结果(第12行)。然后,编译并执行基准测试(第13行),并将输出保存到一个文件(第14这个简单的脚本允许获得表4中提供的信息。中已执行的操作数表4NAS基准测试中内核执行的操作基准总MOps MIops(32位)MFlops(64位)尺码W尺码A尺码W尺码A尺码W尺码ANAS_BT9 109 199 641 1187 26 581 7 922 173 059粤ICP备15044560号-1NAS_EP1 594 12 752 101 805 1493 11 946电话:+86-21 - 8888888传真:+86-21 - 88888888NAS_IS13 104 1 6 0 0NAS_LU26 405 176 137 4582 30 640 21823 145 498NAS_MG1 497 11 880 820 6491 677 5 389NAS_SP17 114 103 519 3197 19 435 13918 84 084关于每个操作类型的信息(例如,浮点对整数)和位宽(例如,32-位与64位)。正如预期的那样,NAS基准测试是浮点密集型代码,尽管在某些情况下,整数运算代表了总数的很大一部分(例如,IS,MG)。注意,基准NAS_IS的操作总数不是整数和浮点操作的总和,因为存在未明确表示为表4的列的基于指针的算术操作。作为Clava灵活性的一个例子,我们可以使用第3.1节中介绍的执行时间测量来扩展操作计数脚本并计算每秒内核操作的估计值(由于计数操作可能会引入开销,因此执行时间应该在单独的运行中测量,而不需要对计数操作进行插装)。用户还可以复制OpsCounter文件18并开发其应用程序。例如,通过定义要计数的操作,或者通过为每个操作赋予自定义权重,来实现自己的操作计数度量。5. 结论本文介绍了Clava,一个C/C++的源代码到源代码编译框架。Clava框架的重点是提供一个具有广泛适用性的编程环境,以及降低进入门槛的特性并为更好的用户体验做出贡献。该框架提供了一种增强的源到源汇编方法,为基于LARA框架的战略提供了一个用户界面。 使用Clava+LARA,用户可以编写自己的策略,并自动应用脚本来分析,编译,转换,编译和执行给定的源代码,所有这些都在同一个脚本中。此外,该框架提供了一组库,可以用作编程新策略的构建块我们介绍了该框架、其结构和主要工具、其设计背后的原则,以及一些简单但具有代表性的示例,这些示例显示了Clava+LARA方法的一些特征。NAS基准测试的内核,当运行大小为W和A. 根据结果,大小A需要比大小W多一个数量级的操作此外,该战略还规定,18 https://github.com/specs-feup/clava/blob/master/ClavaLaraApi/src-lara-clava/clava/clava/stats/OpsCounter.lara。J. Bispo和J.M.P. Cardoso / SoftwareX 12(2020)1005659图十一岁 使用基 准 NAS 的打包版本的LARA 代码 示例 。图12个。 LARA代码的 示 例 ,它检测并运行NAS基准测试, 以估计执 行 的操作数。作为未来的工作,我们计划在涉及以下主题的项目中使用和评估Clava:检测和修补C/C++中的代码漏洞,高级自定义精度策略,软件度量的实现,获得用于机器学习的基于AST的代码功能,以及将计算从C移动到硬件加速器。竞合利益作者声明,他们没有已知的竞争性财务利益或个人关系,可能会影响本文报告的工作致谢这项工作部分由ANTAREX项目通过欧盟H2020 FET-HPC计划资助,资助号为:671623。João Bispo感谢Fundação para aCiência e a Tecnologia , 葡 萄 牙 , 根 据 博 士 后 资 助SFRH/BPD/118211/2016提供的支持引用[1]Chung L,Nixon BA,Yu E,Mylopoulos J.软件工程中的非功能性需求,卷。五、Springer Science Business Media; 2012.[2]穆施科湾Gradle在行动Manning; 2014.[3]马丁·K霍夫曼·B掌握CMake:一个跨平台的构建系统。Kitware;2010.[4]Dave C,BaeH,MinS-J李S,艾根曼R,米基夫S.鲸鱼座:多核的源到源编译器基础设施。计算机2009;42(12):36-42.[5]昆兰·D ROSE:对面向对象框架的更好的支持。并行处理Lett2000;10(2-3):215-26.[6]杨伟杰,李伟杰.语义过程间并行化:PIPS项目概述。In:ICS,vol.91. 1991年,p.244比51[7] Insieme编译器和运行时基础设施,计算机科学研究所,分布式和并行系统组,因斯布鲁克大学,http://insieme-compiler.org检索:08-06-2019。[8]陈C,Chame J,Hall M. Chill:一个用于组成高级循环转换的框架。在:技术.编号08-897。联合南加州; 2008,p. 136比50[9]Spinczyk O,Gal A,Schröder-Preikschat W. Apache c++:c++编程语言的面向方面扩展。载于:第四十届太平洋工具国际会议论文集:互联网、移动和嵌入 式 应 用 对 象 , CRPIT
下载后可阅读完整内容,剩余1页未读,立即下载
cpongm
- 粉丝: 5
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 前端协作项目:发布猜图游戏功能与待修复事项
- Spring框架REST服务开发实践指南
- ALU课设实现基础与高级运算功能
- 深入了解STK:C++音频信号处理综合工具套件
- 华中科技大学电信学院软件无线电实验资料汇总
- CGSN数据解析与集成验证工具集:Python和Shell脚本
- Java实现的远程视频会议系统开发教程
- Change-OEM: 用Java修改Windows OEM信息与Logo
- cmnd:文本到远程API的桥接平台开发
- 解决BIOS刷写错误28:PRR.exe的应用与效果
- 深度学习对抗攻击库:adversarial_robustness_toolbox 1.10.0
- Win7系统CP2102驱动下载与安装指南
- 深入理解Java中的函数式编程技巧
- GY-906 MLX90614ESF传感器模块温度采集应用资料
- Adversarial Robustness Toolbox 1.15.1 工具包安装教程
- GNU Radio的供应商中立SDR开发包:gr-sdr介绍
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功