鲲鹏架构入门与实战︱毕昇编译器——针对鲲鹏架构优化的编译器(附代码)

更新时间:2023-07-28 06:57:46 阅读: 评论:0

鲲鹏架构⼊门与实战︱毕昇编译器——针对鲲鹏架构优化的编译器(附代码)
鲲鹏架构下经过优化的专⽤编译器有毕昇编译器和鲲鹏GCC,除此之外,还有Java环境下的毕昇JDK,
大学排名这3种编译器虽然实现⽅式、应⽤场景各不相同,但是都针对鲲鹏处理器进⾏了优化,和通⽤编译器相⽐,具有更好的性能,可以最⼤限度发挥鲲鹏平台的优势。本⽂介绍毕昇编译器,并演⽰如何安装使⽤。
01
LLVM
在介绍毕昇编译器以前,先简单介绍⼀下LLVM。LLVM 是Low Level VirtualMachine的简称,字⾯意思就是底层虚拟
机,LLVM 开源项⽬最初由美国UIUC⼤学ChrisLattner博⼠主持开发,其⽬的是开发⼀款底层虚拟机,但是LLVM 实际上从来没有被当作虚拟机使⽤,⽽是成为构架编译器的框架系统,LLVM 也不再被认为是项⽬的缩写,⽽是项⽬的全称。
LLVM 编译器和传统编译器有着⾮常⼤的区别,在传统上,编译⼤体分为3个阶段,分别是前端(Frontend)、优化器(Optimizer)和后端(Backend)。前端负责分析源代码,进⾏词法分析、语法分析、语义分析,最终⽣成中间代码,优化器负责对中间代码进⾏优化,后端负责⽣成⽬标代码,架构如图10-1所⽰。
■图10-1传统编译器架构
LLVM 编译器采⽤模块化设计,把前端、优化器、后端解耦,引⼊了统⼀的中间代码LLVM Intermediate Reprentation (LLVM IR),不同的语⾔经过前端处理后都可以⽣成统⼀的IR,优化器也只对IR 进⾏优化,后端把优化好的IR 解释成不同平台的机器码,LLVM 架构如图10-2所⽰。
LLVM 架构的优势主要体现在以下⽅⾯:
■图10-2 LLVM编译器架构
中间表达IR的引⼊、模块化设计,简化了前端、优化器和后端每⼀部分的开发;
⽀持新的⼀种语⾔只需实现对应的前端,同样,⽀持⼀种新的硬件设备,也只需实现对应的后端。
02
02
毕昇编译器简介
毕昇编译器基于LLVM 开发,针对鲲鹏平台进⾏了关键技术点的优化,⽀持C/C++ 和Fortran语⾔,其中
C/C++ 前端使⽤Clang实现,Fortran前端使⽤Flang实现。毕昇编译器还集成了⾃动调优⼯具Autotuner,可以配合编译器进⾏⾃动迭代调优。
⾃动调优⼤致流程如图10-3所⽰,⾸先Autotuner会让编译器执⾏⼀次初始编译,编译时会⽣成包含所有可调优区间的yaml ⽂件,然后进⼊调优阶段。
在调优阶段,Autotuner读取调优区间⽂件,⽣成具体的编译可调参数和范围,并根据特定的算法得到⼀组参数,⽣成⼀个编译配置⽂件,并根据此配置⽂件编译源代码得到⼆进制⽂件。Autotuner根据⽤户的配置运⾏⼆进制⽂件,并记录性能数据,同时把性能数据反馈给utotuner⽤来⽣成新的编译配置⽂件。
经过多次迭代后,可以为选定的调优区间⽂件⽣成多个编译配置⽂件和运⾏的性能数据,最后Autotuner根据性能数据等因素,得到最优的编译配置⽂件。
■图10-3 ⾃动编译调优流程
03
毕昇编译器的安装
截⽌到本书编写时,毕昇编译器的最新版本为1.0版本,下⾯演⽰该版本的安装过程。
步骤1: 登录鲲鹏服务器,创建/data/soft/⽬录,并进⼊该⽬录,命令如下:
mkdir– p/data/soft/
cd/data/soft/可爱动漫头像男
步骤2: 下载毕昇编译器1.0并解压,命令如下:
wget http s://mirrors.huaweicloud. com/kunpeng/archive/ compiler/bisheng_compiler/bisheng- compiler- 1.
tar -zxvf bisheng- compiler- 1.
步骤3: 配置环境变量,编辑/etc/profile,命令如下:
100千米等于多少米
vim/etc/ profile
在profile⽂件最后加上如下的配置保存并退出:
export PATH= /data/soft/bisheng-compiler-1.0-aarch64-Linux/bin:$PATH
export LD_LIBRARY_PATH= /data/soft/bisheng-compiler-1.0-aarch64-Linux/lib:$LD_LIBRARY_PATH
步骤4: 执⾏如下命令,使配置⽣效:
source/etc/ profile
步骤5: 检查clang版本,确认毕昇编译器是否成功安装,命令及成功的回显如下:
[root @ecs-kunpeng soft]#clang -v
bisheng compiler 1.0clang version 10.0.0(clang -954e1c1ac96e flang -7e00dea1acb4)
Target: aarch64-unknown-Linux-gnu
Thread model: posix
InstalledDir: /data/soft/bisheng-compiler -1.0-aarch64-Linux/bin
Found candidate GCC installation: /usr/lib/gcc/aarch64-redhat-Linux/ 4.8.2
Found candidate GCC installation: /usr/lib/gcc/aarch64-redhat-Linux/ 4.8.5
Selected GCC installation: /usr/lib/gcc/aarch64-redhat-Linux/ 4.8.5
Candidate multilib: .; @m64
新生儿黄疸偏高Selected multilib: .; @m64
04
毕昇编译器的使⽤
毕昇编译器基于LVMM,命令clang、clang++、flang的使⽤⽅式和LVMM 相同,下⾯通过⼀个实例演⽰使⽤⽅式。步骤1: 创建/data/code/⽬录并进⼊,命令如下:
mkdir– p/data/code/
cd/data/code/
步骤2: 创建compileTest.c⽂件,录⼊代码如下:
猴子怎么写//Chapter10/compileTest.c
# include<stdio.h>
intmain( ){
signedcharstr[ 100];
printf( "Enter a string:");素炒平菇
scanf( "%s", str);
printf( "You entered: %s ", str);
printf( "\n");
return0;
考研时间分配}
步骤3: 使⽤clang编译该⽂件(为⽅便后续不同编译器编译⽐较,这⾥加⼊了-g选项,⽤来⽣成符号表),命令如下: clang-g-otest_clangcompileTest.c
这样便可以编译⽣成test_clang应⽤程序。
05
编译器机器码对⽐
本节演⽰⼀下同⼀段代码在不同编译器下⽣成机器码的不同,还是使⽤10.1.4节 compileTest.c源代码⽂件。步骤1: 进⼊/data/code/,使⽤gcc编译compileTest.c,命令如下:
cd/data/code/
gcc -g - otest_gcc compileTest. c
这样便可以编译⽣成test_gcc应⽤程序。
步骤2: 安装包含反汇编⼯具objdump的⼯具包binutils,命令如下:
yum install-y binutils
步骤3: 反汇编test_gcc,命令如下:
objdump-S test_gcc
可以得到反汇编后的代码,只截取与main⽅法直接相关的⼀段,反汇编后的代码如下:
#include <stdio.h>
intmain( ) {
400634: a9b87bfd stp x29, x30, [sp, #-128]!
400638: 910003fd mov x29, sp
signed charstr[ 100];
signed charstr[ 100];
printf( "Enter a string:");
40063c: 90000000adrp x0, 400000<_init -0x4a8> 400640: 911ce000 addx0, x0, #0x738 400644: 97ffffb7 bl 400520<printf@plt>
斧头英文scanf( "%s", str);
400648: 910063e0addx0, sp, #0x18
40064c: aa0003e1 mov x1, x0
400650: 90000000adrp x0, 400000<_init -0x4a8> 400654: 911d2000 addx0, x0, #0x748 400658: 97ffffae bl 400510<__isoc99_scanf@plt> printf( "You entered: %s ", str);
40065c: 910063e0addx0, sp, #0x18
400660: aa0003e1 mov x1, x0
400664: 90000000adrp x0, 400000<_init -0x4a8> 400668: 911d4000 addx0, x0, #0x750
40066c: 97ffffad bl 400520<printf@plt>
printf( "\n");
400670: 52800140mov w0, #0xa //#10 400674: 97ffffaf bl 400530<putchar@plt>
return0;
400678: 52800000mov w0, #0x0 //#0
}
40067c: a8c87bfd ldp x29, x30, [sp], #128 400680: d65f03c0 ret
400684: d503201f nop
步骤4: 反汇编test_clang,命令如下:

本文发布于:2023-07-28 06:57:46,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1121353.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:编译器   编译   鲲鹏   优化
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图