0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

鲲鹏GCC编译器具有代表性的三方面优化特性

7riU_gh_3a181fa 来源:华为计算 作者:华为计算 2021-09-02 10:48 次阅读

编译器作为重要的基础软件之一,在各个领域都有着非常广泛的应用。比如在嵌入式领域,如何在有限的空间内丰富应用的功能困扰着众多的工程师,编译器能够辅助大幅度地降低应用的体积,是工程师们不可或缺的好帮手。

再或是 HPC(High Performance Computing,高性能计算)领域聚焦于计算密集型的场景,像气象预报、科学研究等,极致化的应用性能是 HPC 领域不断探索的课题之一,编译器作为重要的性能贡献者,在其中发挥着至关重要的作用。

鲲鹏 GCC 是搭载在鲲鹏平台上的高性能编译器,致力于为用户提供高效的性能体验,在编译算法、指令流水、运算库等方面进行了深度的优化。

了解鲲鹏 GCC 编译器

鲲鹏 GCC 编译器是基于开源 GCC 的高性能编译器,鲲鹏 GCC 与鲲鹏芯片协同,通过编译器技术充分发挥芯片的性能,提升鲲鹏硬件平台上业务的性能体验。除支持开源 GCC 通用功能之外,鲲鹏 GCC 主要对以下三个方面进行了增强。

更丰富的编译算法:提供丰富的优化算法,如内存布局优化、结构体拆分优化、自动矢量化等,大幅提升指令和数据的吞吐量。

更灵活的指令流水:适配鲲鹏平台的指令流水优化,发挥鲲鹏架构极致算力。

更高效的运算库:深度优化数学库算法,提供丰富的矢量数学函数接口,大幅提升数学计算的效率。

当前鲲鹏 GCC 编译器已广泛应用于多种 HPC 典型场景,如气象、安防、流体力学等,性能优势已经逐步展露。其中,SPECCPU 2006 和 SPECCPU 2017 benchmark 跑分平均优于开源 GCC 15% 以上,HPC 典型气象应用 WRF 优于开源 GCC 10% 以上。

GCC 编译器典型优化场景及其优化原理介绍

结构体拆分优化——大幅提升 Cache 命中率

SPECCPU 2006 benchmark 中有一款 libquantum 子项,它用于模拟量子计算机运行整数分解的 Shor 算法,该子项的一个瓶颈在于频繁连续的内存读写,简化后的代码示例如下图左边所示。

dd98c7bc-0b48-11ec-8fb8-12bb97331649.png

内存布局优化原理示意图

从循环中可以看出在结构体 node_t 中,data1 的使用率极高,而 data2 是不使用的。在源代码中,数据是以结构体数组的形式排布在内存中,按照普通编译器的编译方式,每次从内存中取数据时会将连续几个结构体数据加载到 cache 中,而 cache 包含的数据中有一半将不会参与运算,这会造成 cache 空间和带宽的浪费与性能的损耗。

鲲鹏 GCC 编译器会自动检查循环中适合优化的场景,通过将结构体拆分成两个结构体的方式(如上图右),将有效的数据紧凑排布起来,从而提高 cache 命中率和应用性能。经测试,此优化可以给 libquantum 子项带来80%的性能提升。除此之外,鲲鹏 GCC 编译器还支持结构体全展开、结构体成员重排列等内存布局优化,让应用程序的性能如虎添翼。

指令流水优化——更加适合鲲鹏的指令调度模型

通用的指令流水调度是基于各个指令的消耗和指令间的依赖关系合理地调度指令执行的顺序。在不进行指令流水优化时,6条指令依次顺序执行,假设每条指令需要两个单位的执行时间来计算得到结果,由于指令间存在数据依赖,在没有计算得到 V1 值的条件下,无法进行 V0 值的计算,由此导致了一个单位时间的等待,造成性能损失。

在使用指令流水优化后,在 V 系列指令执行等待的一个单位时间内加入了没有数据依赖的K系列指令的执行,所有指令的执行被合理地调度了起来,指令流水优化提升了指令执行的效率和程序运行的性能。

鲲鹏芯片基于 ARM 架构,对指令的消耗和指令间依赖关系的处理进行了优化和增强。鲲鹏 GCC 编译器导入了基于鲲鹏芯片的指令模型,使得指令流水优化的结果能够更加适合鲲鹏芯片的执行,提升鲲鹏软件运行的性能。经测试,该优化可以给 SPEC CPU 2006benchmark 带来2%的整体性能提升。

高性能运算库——极致性能的数学库和矢量数学函数

HPC 领域会运用到大量的数学函数计算,如 pow、sinf、log 等,也经常需要对整个数组内的数据做数学函数运算。如下图举例所示,左边是需要对 a 数组的所有数据进行 sinf 数学计算。

正常情况下会循环遍历 a 数组依次对每个数据进行 sinf 数学计算,无法获得进一步的性能提升空间。鲲鹏 GCC 编译器能够识别该场景,自动将 sinf 数学函数的调用转化为矢量化 vec_sinf 的数学调用,能够同时处理四个数据的 sinf 数学计算,并矢量化存取数据,得到性能的提升。经测试,该优化可以给 HPC 领域 NEMO 应用带来6%的性能提升。

ddd81796-0b48-11ec-8fb8-12bb97331649.png

矢量数学函数优化原理示意图

本文我们主要介绍了鲲鹏 GCC 编译器具有代表性的三方面优化特性:前中端编译算法优化、后端指令优化、运行时库优化。除此之外,还有软件预取、循环优化、分支预测、矢量化等编译优化特性的开发应用。

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 芯片
    +关注

    关注

    446

    文章

    47753

    浏览量

    409049
  • GCC
    GCC
    +关注

    关注

    0

    文章

    104

    浏览量

    24715
  • 编译器
    +关注

    关注

    1

    文章

    1575

    浏览量

    48606
  • HPC
    HPC
    +关注

    关注

    0

    文章

    279

    浏览量

    23418

原文标题:【鲲鹏 DevKit 黑科技揭秘】┃鲲鹏GCC编译器,释放鲲鹏澎湃算力

文章出处:【微信号:gh_3a181fa836b6,微信公众号:华为计算】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Labview如何内嵌操作第三方EXE程序!

    自己在网上搜了下相关资料,能把第三方EXE内嵌进入容器里,但是有个问题,这个第三方软件必须手动拖到容器正中间,手动最大化。请问有什么方法可以自动实现吗? 下图是我内嵌的POLL 软件。如图!
    发表于 04-18 14:26

    lsl文件中将text段copy到ram,编译器具体是如何实现的?

    lsl文件中,将text段copy到ram,编译器具体是如何实现的?
    发表于 02-02 07:23

    Android编译优化之混淆配置

    为了使用java8及后续java新版本的特性,Google增加了一步编译过程—脱糖(desugaring),但这一步会导致更长的编译时间,这也是为什么Google会推出D8和R8编译器
    的头像 发表于 12-21 09:21 452次阅读
    Android<b class='flag-5'>编译</b><b class='flag-5'>优化</b>之混淆配置

    编译器优化选项

    这一点,需要了解编译器的能力和限制;第三,要了解硬件的运行方式,针对硬件特性进行优化。本文着重展开第二点和第三点。 简单认识编译器 要写出高性能的代码,首先需要对
    的头像 发表于 11-24 15:37 404次阅读
    <b class='flag-5'>编译器</b>的<b class='flag-5'>优化</b>选项

    OpenAtom OpenHarmony 三方库创建发布及安全隐私检测

    ,通常在应用开发中通过N-API暴露JS接口的方式使用,或直接编译在OpenHarmony操作系统镜像中。 鼓励开发者通过OpenHarmony三方库中心仓(地址为:https
    发表于 11-13 17:27

    新版编译器的设计思路和优化方法

    小程序编译器在小程序开发、预览、发布各个阶段都需要使用,因此编译器性能会直接影响到开发者开发效率,也会影响到开发者工具的使用体验。 由于旧版的编译器(基于 webpack4)在构建大型项目时会很慢,内存占用也高,一直被开发者吐槽
    发表于 10-13 11:21 149次阅读
    新版<b class='flag-5'>编译器</b>的设计思路和<b class='flag-5'>优化</b>方法

    Linux 下GCC编译

    一、Linux 下多文件编译 在上一篇 Linux 下的 C 编程我们知道了 Linux 下的编译器GCC ,以及如何使用 GCC 进行编译
    的头像 发表于 09-11 15:18 1078次阅读
    Linux 下<b class='flag-5'>GCC</b>的<b class='flag-5'>编译</b>

    gcc、glibc、arm-linux-gcc之间有哪些联系?

    The GNU Compiler Collection,通常简称 GCC,是一套由 GNU 开发的编译器集,为什么是编辑器集而不是编译器呢?那是因为它不仅支持 C 语言编译,还支持 C
    的头像 发表于 09-04 11:47 1472次阅读

    ARM编译器优化版本1.0

    ARM编译器armcc可以优化您的代码以实现小代码和高性能。 本教程介绍了编译器执行的主要优化技术,并解释了如何控制编译器
    发表于 08-28 07:11

    Linux使用gcc编译程序的语法

    01. 调试相关的宏 在Linux使用gcc编译程序的时候,对于调试的语句还具有一些特殊的语法。 gcc编译的过程中,会生成一些宏,可以使用
    的头像 发表于 06-22 10:51 378次阅读

    SDCC-Linux下的51 MCU编译器

    SDCC (小型设备C编译器)是为8位微控制器开发的免费C编译器。尽管兼容多种不同体系结构,但SDCC C编译器更适合8051内核。 SDCC是命令行固件开发工具,含预处理器、编译器
    的头像 发表于 06-16 15:19 3643次阅读

    在opensdk中更新gcc的方法是什么?

    我使用 opensdk 已经有一段时间了,我必须说它(在两种意义上)工作得很好。唯一的是现在相当古老的C编译器。我希望较新的 gcc 版本将有(甚至)更好的优化 -> 更少的代码
    发表于 06-09 06:02

    编译器优化那些事儿之区域分析

    为了有效地优化代码,编译器需要在程序的各个节点建立并求解与信息有关的方程来收集数据流信息,并将这些信息分发给流程图的每个块,这个过程被称为数据流分析。
    的头像 发表于 06-07 11:36 442次阅读
    <b class='flag-5'>编译器</b><b class='flag-5'>优化</b>那些事儿之区域分析

    深度学习编译器之Layerout Transform优化

    继续深度学习编译器优化工作解读,本篇文章要介绍的是OneFlow系统中如何基于MLIR实现Layerout Transform。
    的头像 发表于 05-18 17:32 413次阅读

    R32C/100系列C编译器包V.1.01 C编译器用户手册

    R32C/100系列C编译器包V.1.01 C编译器用户手册
    发表于 04-28 19:54 1次下载
    R32C/100系列C<b class='flag-5'>编译器</b>包V.1.01 C<b class='flag-5'>编译器</b>用户手册