摘要: 探讨一下软件移植到鲲鹏平台过程的原理,以及软件工程的相应的过程。
Linux 环境下跨平台软件移植过程中,须要开发者浏览代码、手工批改、重复编译和调试,移植周期长,效率低,那么如何改良周期长,效率低的问题呢?
基于此,来自华为智能计算专家张汝涛带来了“90% 代码如何实现主动移植到鲲鹏平台”的主题分享流动,他次要从鲲鹏开发套件实现基于 C /C++ 软件的高效代码移植,减速开发者实现跨平台软件移植两个层面进行分享。以下分享的速记内容:
明天要讲的主题是关于软件迁徙这一件事,是一个长远的话题。因为但但凡牵扯到切换平台、CPU 架构的变动,甚至一些语言版本的降级,咱们都可能会面临到一些软件迁徙的问题。明天一起来探讨一下软件移植过程的原理,以及软件工程的相应的过程。
鲲鹏在软件移植的过程当中,如何去帮忙开发者去晋升效率,如何把鲲鹏积淀下来的,把华为积淀下来的软件开发以及统一的教训如何反馈到开发者,让开发者可能减速软件开发的进度,降低成本。咱们推出咱们鲲鹏的开发套件,帮忙用户做软件的移植,以及做基于鲲鹏平台的性能减速,明天次要是这样三个内容。
一提到软件移植,我不晓得大家有多少是做了比拟底层软件的,做底层软件的话,大家可能会用到一些汇编,C++ 加这样的底层语言。用到这种底层语言,它是会和机器的硬件架构强相干的,当你在从一个平台切换到另外一个平台的时候,这些强相干的语言势必要进行一次,跟咱们所采纳的编程语言以及移植的平台环境强相干。
当咱们用汇编代码或者是用这种编译型语言的时候,咱们就会面临着一些移植的问题、一些挑战。有些问题可通过编译器能解决,有些问题特地是一些低阶的代码或者底层的代码,咱们就会可能要面临着必须要手工去查手册,而后去把它相应的去转换到新平台所应用的机器码。
这里就列出咱们鲲鹏处理器和 x86 处理器的一个指令差别,例如一个简略的两个数相加,两个 int 型相加的这样一个简略程序。通过 GCC 编译完之后,咱们去通过 OMGD,咱们就能看到指令的具体的格局模式以及相应的对应的汇编代码。这里能看到对 x86 平台而言,因为 x86 是 CICS 指令是简单指令集,鲲鹏是齐全兼容 Arm64 架构的,是华为自研的 vinic,指令集也是和 Arm64 副精简指令集是齐全兼容的。
其实所谓的经限指定集和简单指令集的辨别是从上个世纪的 70 年代开始的,IBM 已经做过一个钻研,就是对于说 CPU 如何去高效的运行,而后他们会发现可能有些罕用的指令或者是程序代码,过后背景下罕用的程序代码,可能罕用的和不罕用的有很大的差别,过后又因为 IC 的制程或者工艺或者器件的设计程度没有当初这么突飞猛进,所以就会想如何去把 CPU 从硬件设计上简略一点,从软件上高效一点,所以他们就提出了精简指令集这么一个概念,其最大显著的特点就是它的指令宽度就是长度。咱们说的指令长度,是相等的,也就说每一个指令这个位宽是相等的,那么每个指令执行的 SICO 简直也雷同,就是他把很繁冗的事件做的尽可能的简略,而后用很多简略的操作去实现一件简单的工作。
从相同的简单指令集的角度,咱们看一下 x86 上面的简单指令级,它每一个指定的长度是不同的,也就是说像这里列举的 mov 和 add 这两个指令,它的机器码、指令码是不同的,长度是不同的,势必会造成咱们 IC 器件的解码器,以及包含咱们真正的到软件流水操作上解决的步骤是不一样的,也必然会导致咱们每条指令的执行的周期是不同的,然而这样也有一个益处,就是我一个指令就能实现一个比较复杂的事件,只管说我的指令可能会变得很长,然而我一条指令能实现一比较复杂的事件,对下层的程序员来讲,可能就便于了解或者是绝对的会容易了解一些。
这就是精简指令集和简单指令集的一个简略背景,在反汇编下来的 x86 指令集和鲲鹏指令集的汇编代码上,能够看到操作指令是齐全不同的,计存器的命名也是齐全不同的,在 x86 的平台上,有 16 个通用寄存器。这里讲的是 x86 64 模式下,有 16 个通用寄存器,浮点计存器,依据咱们反对的 MMX 技术、SSE 或者是 ABS 技术,x86 平台最多能够存在 32 个浮点寄存器。
反观鲲鹏平台,因为它是和 Arm64 指令兼容的,所以指令集要事齐全对照,所以从这个角度来讲,鲲鹏平台有 31 个通用寄存器,除了这 31 个通用寄存器以外,还有一些状态寄存器或者是一个站寄存器。那对应到浮点寄存器,就有 32 个这样一个叫做 ASMB 的的 advances 单指令多数据这样一个寄存器。鲲鹏有 32 个寄存器位,位宽是 128。这一点是和 x86 64 平台是有差别的,比如说当初 x8664,它如果反对 ABX512 的话,它的位宽是 500 12 比特,从这个角度上,是一个硬件器件差别是非常明显的。
而后从反汇编的角度来看,大家不晓得有没有留神到 x86 平台上有一个 mov 指令。从第一行咱们能看到从寄存器、rbp 一个 mov 的存储数据,到 EDX 这样一个寄存器,做一个从把变量从内存里漏斗进来。同样的一件事件在下面的鲲鹏处理器平台上寄存器的指令就变成了 LDR 和而后上面当然加法还是有 add 的,而后存储的时候对于 x86 来讲,又是从寄存器 mov 到了内存力,然而对于鲲鹏平台它是用一个 str 指令,所以这也反映出了一个 risk 指令的特点,兴许是第 2 个特点,咱们权且这么叫,它是用一个 load stall 这样一个模式,也就是说在鲲鹏处理器平台上不反对内存到内存的一个间接拜访,必须要通过一个寄存器作为桥接作为一个直达。
这一点是和 x86 指令复杂型指令集不同的另外一个中央。还有就是在 x86 这个平台上,它的内存拜访的模式十分多,对于公共平台上就没有丰盛了。这个就是以一个程序为例,简略列举一下,从 CPU 的角度来看,同样是一段 C 代码,CPU 他做了不同的事件,执行了不同的指令,通过不同的周期不同的运算当前,它会输入最终计算的一个后果。当然从这个角度来讲,从这段程序两个平台是没有任何差别的,除了指令上以外,执行后果是不会有任何变动。
但这里侧面反馈进去,因为指令集不一样,所以对于 C,C++ 这样偏底层的这样一个语言来讲,尽管它是个高级语言,然而必须要思考一个平台差别,在平台切换的时候,甚至在平台这个软件的编制过程当中,就要思考一个平台兼容性,所以要养成一个良好的编程习惯。
跨平台移植软件要面临的不少问题,因为软件移植自身就是一个工程性问题。这里通常第 1 步来讲,如果说咱们决定从 x86 平台迁徙到鲲鹏平台,就要去判断一下这个软件迁徙值不值得,艰难有多大?通常目前的罕用的做法就是把 x86 的平台,相应的软件包拿下来,而后去看看它的依赖性关系。这个是什么意思呢?就是咱们看看这个软件,如果跑在 x86 平台上,它依赖哪些第三方组件?这些第三方组件在你这个指标平台上存不存在要做一些这样的判断。这种判断通常都是这个平台之间的反反复复的装置、运行,而后依据零碎报进去的谬误去一个个来排除,所以这都是通过人工来实现的,比拟吃力。如果有移植教训的同学就会感觉比拟吃力,有些事件很繁琐琐碎,一个不小心就错了,可能还找不进去起因。
当你解决完第 1 步编译的过程的这个问题之后,你可能会还碰到一些跑过,后果新平台上呈现了 function fault,功能性谬误咱们就很厌恶了,可能性起因比拟多,有的是自身软件逻辑有问题;可能是第三方组件的 APA 跨平台兼容性有问题;可能是零碎自身反对度也有问题,这个就是影响因素比拟多。这样就须要移植之后,技术人员去相应定位。定位对每个人对相应的工程人员来讲,业余技术要求会比拟高,也存在着一个重复编译、重复调整、重复验证,这个过程老本会很高。
当实现了性能验证之后,跑过一些根本测试当前,感觉这个软件在新平台上能够刊用了。你可能会面临的一个性能的问题,当你用在工作环境、生产环境的状况下,因为生产环境的软件都心愿用最小的硬件跑出最大的性能,而后跑出最高的一个性价比,这时候都会对软件性能上的需要,对它有要求。这个时候咱们就会不得不去采取一些办法,例如用一些商业软件也好,或者一些开源的软件命令也好,去剖析这个软件的瓶颈到底是哪里有问题,是零碎有配置的参数有问题,还是我软件自身逻辑有问题。
所以这三步是咱们在华为的软件这么多年的开发过程当中积攒下来感觉比拟重要的三步,对咱们软件的品质、移植的品质是有决定性影响的。这三步也同时对于任何人来讲,可能都不是一个能轻松超越的几个阻碍。
对于咱们软件移植这件事件,通常咱们讲的是对于编译型软件会面临这样的一个艰难,对于解释性反而比拟轻松,为什么?比方像咱们当初罕用的一些 Java 的或者 Python 的,甚至一些 GOD 这样一些软件,咱们的依赖是什么?依赖的是语言所提供的虚构运行环境,甚至是一些像 Java 提供的 Java 虚拟机 GUM,咱们只须要选一相应平台的 GUM 装置,咱们就能把底层的所有差异性都屏蔽掉。
这个软件只依据运行环境去跑,通常是没有问题的。对于像 C,C++,GOD 这种的,可能作为编译,甚至说可能会调用 C,C++ 加这种组件的这种软件,咱们就须要 C,C++ 这种代码进行移植,能够分这么几种状况。
第 1 种是开源软件,对咱们通常是和社区进行单干,让社区去反对空洞平台,或者是反对 M64 的平台,这样咱们就一劳永逸的解决问题。而后对于自研软件,对于有些 SB 用户会开发者资源软件,他不能凋谢代码,咱们就须要进行商业单干,去疏导客户去移植到咱们鲲鹏平台上。
对于商业 B 软件是最典型的,比如说像微软的一系列软件,或者是 Oracle 的软件数据库,咱们不可能去取得源码,去推动他们和咱们中国的软件界单干也非易事. 这个时候你只能找到要么是单干,要么就是找一个代替计划,对吧?如果切实是又不能替换用户的业务,又不能去批改,咱们就可能不得已采取一个鲲鹏平台和 x86 进行一些混合部署,这是一个软件部署方面的策略。
还有一种就是对于咱们罕用的 windows 平台的一种系列开发,咱们也晓得 windows 尽管一年多前可能说要反对 Arm64 这个架构,但实际上到当初为止他也没有发表。其实商业上的思考或者是其余的因素可能都思考的比拟多,尤其是这样一个大体量的公司,然而对于 windows 平台就是说咱们进行有限度的在开元生态外面进行有限度的反对,比如说像微软的 C shut,其实他的 call3.0 曾经开源了,曾经在 Arm 平台上可能用起来了。换句话来讲,咱们也能够在鲲鹏平台上基于 call3.0 反对 C shut。对于鲲鹏软件移植的过程,能够把它合成为这样几个步骤流程,其中最重要的就是所列到的第 2 步第 3 步以及性能达标剖析这一步,咱们当初提供了相应的每一步提供一些的辅助工具去帮忙客户进行用户开发者进行剖析进行移植。
其中的二进制文件依赖扫描,是咱们去提供了一个工序软件进行软件装置、依赖库的扫描和软件运行依赖库的扫描。依据咱们长期积攒的有一个兼容性清单,这个兼容性清单笼罩了市面上大多数风行的以及罕用的 OS 以及相应的版本,还有相应的 GCC 的版本,对于移植的第二阶段,像移植批改 C,C++ 原码,咱们也同样提供了一款工具去做 C,C++ 源码的剖析,这个剖析次要是集中在这样几个方面,集中在汇编代码、边选项,还有宏定义,还有 built in 函数和编辑提供的 built in 函数和 attribute,而后去重点检查用户的 Makefile 和 CMakeList。如果用户软件是用 make 构建的或者 CMake 构建的,咱们能帮忙去发现一些,辨认一些移植中须要批改的中央,同时咱们会给出移植批改的倡议。
当移植实现之后,咱们会提供一个性能剖析的工具,去帮忙用户去 check 这个软件是不是可能达到工作这样一个规范,也就是说 check 它的性能指标,咱们会去进行系统性的性能剖析,也会去做软件级的热点定位剖析。而后在此基础上咱们会给用户提供一些华为所积攒下来的认为比拟无效的一些软件优化的办法,做一些比如说终端版壳操作,甚至一些其余的软件批改的这样倡议,这个就是咱们明天要介绍的三款软件,通过这三款软件咱们就能比拟不便的或者比拟高效率的实现 C,C++ 代码,从非鲲鹏平台向鲲鹏平台的这样一个迁徙值的过程。
在 C,C++ 软件移植的过程当中,咱们要着重思考三个方面的问题,第 1 个问题是软件构建文件的差别。这外面举两个例子,一种是咱们这个计划外面,咱们可能在 x86 平台上常看到一个叫 -M64 的这样一个晓得编译选项的 option,这个含意,实际上是说要把我这个软件生成成为 64 位模式的。是分成 64 位模式的,咱们编译指标代码的 ABI。实际上在鲲鹏平台上,咱们能够用相似的,咱们能够用 -mabi=lp64 去来替换,当然如果平安的状况下,加上 -FPIC 就生成一个 flowting 的 address,来屏蔽一些底层的相干依赖性,这样子就能达到一个编译选项 M64 的一个替换。
还有一个就是对应 Arm 指令集、SA 的这样一个替换,咱们罕用的可能会见到一些 -march 的这样一个参数,在 x86 的平台上提供了多达二三十种架构平台,从 intend 到 AMD 的各种各样的,Arm 平台来说,就绝对简略一点,咱们只须要去选用咱们鲲鹏平台,你 CPU 所反对的兼容 Arm 的架构。咱们鲲鹏 920,咱们进入的是 AArm8.2- a 这样一个架构。如果这些版本比拟新,比如说 9.1 以上的,咱们就能够去选用 -mtune=tsv110。这实际上是咱们泰山微内核 110 这个型号这外面会在 Gcc 外部进行了咱们提了一些措施,针对架构做的一些的 public 的 tune 优化,可能提供一个绝对较好的性能。性能减少,据说有 5%~10% 的性能晋升。
接下来第二局部就是 C,C++ 原码的移植,这外面也举两个例子,第 1 个例子是这个是根本数据类型,只管说咱们鲲鹏平台反对的是 LP64,而后这个 x86 平台也反对 LP64 的这样一个标准,然而实际上大家在某些细节定义上还是有区别的,尽管字符宽度,比如说对 x 来讲都是 8 字节,然而 x86 他这个 x 是有符号类型的,然而对于咱们鲲鹏平台,咱们用是无符号类型的,但这块的改变咱们就能够通过批改 makefile 外面,加一个参数,加上 -makefilex,去把默认的无符号的 x 定义成有符号的 x,这样就能保障 C 代码逻辑,对于 x 操作上不会引入歧义。
第 2 类问题就是咱们编译器当中提供了多达数百个的这个宏定义,能够被咱们 C,C++ 软件识取,比如说咱们用 GC 的话,咱们能够在 C,C++ 的软件外面,原文件外面间接去应用相应的宏定义,这个宏定义在编译的时候可能会咱们的编译器间接做环境变量的 check,而后间接设置了相应的正确的值,跟 host 环境相干的。我这里指编译和运行在同一款机器上,咱们不讲 host 和 target 相异的状况。这个时候对于相应的软件,咱们就可能须要辨别一下宏定义,比如说像这里 x86 64,显然一看就晓得他是反对 x86 的,不可能在咱们鲲鹏平台上运行,这时候咱们就会倡议用户去批改用户代码,用预编译的形式做软件范畴的定义隔离,很显然对于咱们鲲鹏平台,咱们罕用的关键字就是 aarch64 或者是 Arm64,这样的关键字去做软件逻辑的定义,除了这些以外,包含 BBC 都有各自的架构定义关键字。
第 3 类问题就是咱们汇编代码的移植,这也是最头疼的一块,因为 x86 平台如果细算的话,他将有 2100 个不到的汇编指令,鲲鹏平台因为兼容 Arm64,咱们有 1000 出头,1100 不到,这样一个汇编指令,其实这加起来 3000 多条指令,如果大家想把它分分明,那是十分苦楚的。Int 的相应指令集的手册有 4000 多页,Arm 相干指令集的手册有 7000 多页,纯英文的文档大家读起来必定会解体的,所以在这外面汇编代码的移植,这是一个难点。
汇编代码在咱们的软件过程中体现有若干种模式,第 1 种是咱们纯正的就用 Asm 关键字去写汇编代码,第 2 种是咱们用 built in 函数做一些替换,比如说这里举个例子,像 GCC 里提供了 built in 的 CRC 的 32 计算的一些减速指令,咱们能够去寻找鲲鹏平台上的相应的指令去进行替换,比如说像 x86 平台上用到的预取的指令,咱们也能够去找到鲲鹏平台,上的 built in 函数去做替换。接下来还有第 3 种,就是咱们可能会用到的 Intrisic。Intrisic 实际上是在 jcc 里提供的像 C 语言能够一样去应用的汇编函数,引出这个 Intrisic 是在 x86 平台上和 Arm64 平台,就相差十分的大。
在 x86 的平台上 Intrisic 总数总数将近达到 7000 个,7000 不到,而后在鲲鹏程度上相差就差的比拟多,远远少于这个数,为什么?这是因为在 x86 平台上它反对的指令集比拟多,他本人通过二三十年的演进,对吧?他有 mx 的指令集,有 SSE 的指令集,还有 AVX,AVX 也分了 128 比特的,256 以及 500 12 比特的三种。每一种它对应的 Intrisic 十分的多,所以移植的数量是十分大的。在这个外面咱们能够找到一些,比如说对于一个 28 比特的操作进行一些对应,能够做一些替换。
针对下面提出的这些问题,比如说咱们 C,C++ 方才提出这些问题,咱们就提供了这样几个工具,咱们这里提供了剖析扫描工具,代码迁徙工具。剖析扫描工具,就是辨认咱们软件移植的依赖性,而后去帮忙用户做兼容性的排查。而后第 2 个提供代码迁徙的工具是做源码的构建工程工程构建文件,还有 C,C++ 原码以及汇编代码的扫描移植领导。第三个工具就是性能优化工具,咱们刚把软件移植到鲲鹏平台之后,咱们须要去用这个工具去剖析性能,去发现热点,咱们也提供了基于鲲鹏平台的一个减速库这么一个概念,一个组件。这外面就提供了一个软件硬件协同减速用户利用的一个形式。
比如说咱们这里优化了 GDPC 根底运行环境,咱们优化的压缩、加密、加解密,包含一些数学计算这样一些开源的或者是三方的组建,咱们优化了一些 IPP 信号处理的一些程序性能晋升,就是用咱们软硬联合的形式极大晋升了性能。这外面咱们大抵剖析的一个流程,咱们会在剖析扫描外面,咱们把用户的软件上传到咱们的工具环境下,咱们工具环境就会剖析用户 X86 平台上软件的安装包,比如说这里的 RPM 包还有一些 JAR、Java 类的程序,包含一些压缩包,咱们就会去扫描辨认外面软件包外部以及软件装置门路内,包含咱们压缩包外部的集成的,比如说这些 SO 件、二进制文件,去测验它是否在鲲鹏平台上不同的操作系统上是否反对,去反馈用户一个一致性的剖析报告,会一一通知用户 SO 是否兼容,不兼容的话怎么去解决?咱们会提供链接是原码的值,这个是源码级的链接,或者是提供移植文档形式书的这种链接,都会在咱们报告里提供进去。
咱们这个工具提供了两种工作形式,一种是咱们通过命令行的形式,上面这种模式通过参数输出,一种是通过这种内部形式,咱们在做了安装包的依赖性剖析以及原码的扫描之后,会给用户产生一个移植剖析领导的报告,这个报告是提供 CVS 的格局或者是 HDM 的格局,用户能够去下载,外面就会具体列举出哪些依赖库,哪些二级制文件须要移植,而后哪些 C,C++ 以及汇编代码,须要移植规模有多大?会给用户出现一个移植的工作量,比方以每月为单位提供一个工作量。
计算规范,用户是能够本人输出的,比如说你的编正能力强,你一个月 C,C++ 代码,你能够实现 800 行,汇编代码你能够实现 600 行,对吧?如果你的移植能力无限,有的编码能力无限,技术老本无限,你能够把它设置成比如说我 C,C++ 代码一个月 300 行,汇编代码 100 行,它就会依据不同的规范,计算出你移植工作量,做工程技术上的第 1 步,第 1 部信息把握。
这里就列出了咱们次要的性能,后面我曾经根本赘述了,就是 SO 文件的查看,构建工程的查看、源文件的查看,评估一致性,而后进行工作量评估,两种形式,内部形式和命令行形式。
通过这个工具,咱们就能够拿到软件移植的工程量的第 1 手材料,而后决定是否移植。当决定极值之后,咱们就能够用代码迁徙工具去做进一步的剖析,代码移植工具次要是剖析了用户的源代码,还是一样,他着重剖析的是 makefile,C,C++ 的源码,就包含咱们这里的编译器提供的宏定义,而后用户自定义宏,还有 built in 函数,Intrisic,还有汇编代码,咱们剖析完这些内容会提供一个详尽的移植领导,这外面就蕴含 makefile 怎么批改?C,C++ 代码怎么批改?然汇编代码,咱们怎么去批改?
这里咱们只是给移植倡议,咱们并不去批改用户的原码,用户能够参照着相应的输入咱们这里输入的统一报告,去用 GTDF 的形式,大家去做一个这个比照,而后去把它在工具界面以外用第三方的,比如说用其余的编辑工具把它实现批改。那么这一页咱们就列出了咱们代码移植工具的一个大抵工作流程,同样咱们也是内部形式和命令行形式两种形式,不便用户做抉择。咱们剖析用户的源码构建工程,还有公共建工程配置文件,还有 C,CC+ 加的源码或者是汇编源码,而后给出移植晓得,那么对于源码的变动,咱们会提供比照的形式显示,像这里举的例子就是右边第 1 点是咱们要改哪些文件,就是批改文件列表,第 2 类就是咱们要原文件是什么样子,第 3 类就是咱们倡议批改成什么样子?
这是咱们软件移植工具所能提供的能力,咱们 C,C++,咱们这里还是针对 C,C++ 目前为止 C,C++ 的这样编译型语言, 去做了倡议值,而后咱们要有源码,没有源码,也就谈不上移植了。
后面曾经讲了,咱们如何去做软件依赖性的剖析,通过华为开发套件去做软件依赖性的剖析,以及做 C,C++ 的移植,咱们在实现移植之后,咱们会在生产环境下来跑咱们这个软件,咱们可能会去做性能剖析,这时候咱们就会提供一个咱们叫做剖析的一个工具,这个工具次要是帮忙用户去做软件性能定位,比如说你有些性能瓶颈或者有想持续优化,咱们这里提供了一些伎俩,这里对于这个工具咱们能够帮忙用户去剖析处理器相干指标,以及看到调度的一些信息,包含外设的信息,包含 CPU、磁盘,甚至网卡、短期性的数据,去帮忙用户剖析 C,C++ 或者是 Java 程序这样一个性能指标。
咱们 Java 类不是说把 GBM 当成一个过程,咱们是看到 GBM 外部的,还是有肯定作用的,还是比拟有用的。咱们会把这些数据通通的剖析起来,而后通过咱们本人定的定义的数学模型进行剖析,去看到用户的软件性能瓶颈,比如说是资源竞争的问题或者是调度的问题,甚至说比如说有一些 bug 导致了一些次循环等等的,咱们提供了多种的形式来出现这样一个后果。比如说咱们罕用的这种火焰图的形式,咱们这里可能提供比拟直观的可视化形式,帮忙用户去看本人的软件外面到底有没有性质上的问题。
这个是咱们这里是列举一下咱们目前性能剖析工具可能提供的性能指标,咱们可能看硬件器件相干的,比方 CPU、内存、磁盘、网卡、零碎级的,咱们也能看这种线系统调度以及的比如说过程、线程,还有彼此之间的切换,或者是资源的争抢,锁这样的一些要害变量的这样一些性能剖析后行指标,咱们也提供了一个基于火焰图、基于代码逻辑的深层次查看,可能提出用户代码的真正的开销,大的中央在哪里,对应的代码对应到源码。
通过这样一个伎俩,咱们就能帮忙客户比拟快的去帮忙开发者比拟快的定位本人的软件,编译形软件的瓶颈。,当定位到软件瓶颈的时候,咱们会提供一些附加的能力,比如说这里咱们就提供加一个叫减速库,咱们软硬联合的减速库帮忙用户去优化代码。这个起因是什么?这起因次要是因为咱们鲲鹏是一个 sock,咱们是一个片量零碎。
除了泰山内核,以及多达 48 甚至 64 的内核以外,咱们还提供了一些额定的能力,额定的一些引擎,这些减速引擎就能够反对,比如说压缩 LZ77 的这种算法,还有加解密的,比如说非对称的,还有对称加密的,包含一些罕用的变加解密的这样算法,比如说 DH 编码等等。
咱们还反对了比如说存储用到 code 等一些这样一些罕用的软件算法,咱们把它运化成加速器,这种压缩用起来非常简单,就跟咱们用一个外设一样,咱们只须要从华为的网站下来获取相应的硬件驱动代码,把它装置上之后,咱们就能够像一个失常的外设一样去应用它。
当然了你要应用咱们提供的一些 API 的话,可能还要遵循一些, 比如说咱们要提供给用户手册,用户可能要去批改一下本人的源码,比如说可能原来掉的一些是软件的这样一些函数,或者是三方组建的 API,这时候可能去要用加速器的话,就须要依据 API 批改我相应的这个代码逻辑,但这个代码逻辑只是存在于 API 层面。
这里举个例子,比如说咱们这里集成了一个叫 RC 的减速的引擎,是用来计算 finish 加密的,咱们反对 1024~4096,4 种:1024 2048 3072 3096,4 种密钥长度。咱们在咱们加速器引擎外面,咱们是通过一个用户态的来 libry 去做一个隔离,对下来隔离用户的,比如说开源的第三方软件,比如说这里贴到 open SSL 的的 API,咱们去对接 open SSAPI 咱们也能够把 API 裸露进去,间接给用户的 APP 去应用,在 libry 上层的就是咱们 IC 引擎的相应的驱动,用户能够齐全不必晓得上面细节是如何实现的,然而咱们通过只有应用咱们正确调用鲲鹏 RC 的提供的用户 libry,就能够去应用咱们加速器的硬件计算能力,极大的放慢了 RC 的计算。
其实咱们也晓得 RC 计算如果用 CPU 算的话,那是相当费时费力的。比如说一个像 x86 的一个中高端的一个 call,可能它每秒钟只能执行 720 次左右的一个 RC2048 的计算。然而你要用到了鲲鹏 920 提供的 RC 计算引擎的话,计算量将是大幅度的晋升,也就是说,我能够把本来用来计算 RC 的这些 CPU 齐全释放出来,跑我的业务!在一个芯片内实现这样业务,就会对用户来讲就会提供另外一个抉择,我不须要去买某些 PCIE 的插卡,我间接去用软件的形式来晋升我的软件性能,达到一个比较简单的晋升性能的一个形式。这是咱们举的一个例子,在这些外面,在咱们移植工具外面,都会去通过咱们软件移植的这样一些能力去提供给开发者间接应用。
这个是咱们几个工具组建的公布的策略,咱们目前为止是停留在两头这一列上,咱们实现了多 OS 的适配,比如说咱们反对 3~4、74、7.5、7.6、7.7、7.8 对吧?咱们也反对中标麒麟等,咱们也反对了像苏 C 这样一些的操作系统,就是咱们尽可能的去帮尽可能笼罩咱们罕用的这样一些操作系统的类型,咱们也反对了 GCC 的多个版本,咱们从 4.8.9 始终反对到目前为止至多 8.3,咱们后续会反对到 9 点几的版本,始终往上反对下来,帮忙客户去尽可能的简化一些重复劳动,咱们也反对 MAC 构建工具,也要反对 CVK 构建工具,将来还会反对 automake 这样的一个构建工具的一些查看。
反对 C,C++ 的与代码移植,也反对汇编代码的辨认,因为方才后面说了,从汇编指令的角度来讲,从你 Intrisic 的数量来讲,这个量十分的大,而且也很有技术挑战的,就是汇编语言的替换,所以这块咱们会逐步完善。对于减速这一块,咱们是提供一些 Intrisic 的一些替换,比如说咱们有 abs 或者有 SSE。
咱们也去优化了,像一些罕用的减速的三方的组件,比如说像一些 z -lib 的减速或者 stapi 的一些减速,还有一些 scan 这种字符扫描的减速的,咱们用鲲鹏的指令去进行优化,进行性能晋升,获得了比拟可观的一个性能扭转都是 50%,一倍,甚至更多的 3,4 倍的这样一个性能晋升,所以减速的成果还是挺显著的。这样也能让用户的软件应用跑在空间当中跑的更快又快又好。
如何去获取咱们这几个工具,咱们能够通过华为的 spot 网站去下载,也能够通过华为空方社区去下载相应的软件,这下面提供了一些链接。
对于咱们减速库软件,这里的策略是次要采取开源的这种策略,比如说像 JDPC 或者一些三方组建的,包含一些压缩算法,压缩引擎的,包含这些软件组件,咱们都是把相应的 patch 去推动到社区外面去。对于硬件加速引擎,咱们也是间接能够从华为的鲲鹏社区下来下载,而后去装置应用,取用起来还是比拟不便的。
鲲鹏社区当前就是华为重点建设的一个和开发者沟通的互动的中央桥梁。在这个地社区里,咱们就能够下载到数百份的软件移植领导以及相应的软件调优的教训,能够在这外面和其余的开发者做互动,做技术上进一步的探讨。而后很多新的技术材料、技术文档,包含一些白皮书,一些产品设计计划都会在社区里陆续公布,不同的开发者都能失去一些不同的信息。
这里列出来,咱们空开发者社区外面如何去失去两工具这几个工具,目前咱们这些工具都曾经上线了,9 月 30 号是第 1 版本,9 月 30 号当前咱们是每月逐月公布的这样一个节奏,这个节奏将连续到 2020 年,就是说咱们不是一个短期行为,咱们会始终从开发者的需要角度来登程,去把这个工具做的更加利用,更加不便帮忙用户实现 C,C++ 加代码的 90% 的工具化移植。
其实在鲲鹏的开发的平台外面,因为鲲鹏是地面平台,是一个新生事物,对吧?对于 x86 而言是一个新生事物,在这个外面咱们也能感触到,随着鲲鹏计算平台的壮大,利用越来越多,须要大量的开发者去投入到平台的生态建设外面来。所以华为在这里推出了这种线上认证培训的这么一系列的技能晋升的流动,包含在线课程,包含云端的实验室,包含线上认证和线下培训,心愿大家可能积极参与,来独特构建华为鲲鹏的生态软件生态。
这里提到一个华为鲲鹏认证开发工程师这么一件事件,就是 HCIA 认证认证其实在华为外部还在对华为来讲还是蛮有价值的,对开发者来讲也是很有价值的。因为你通过了认证之后,在肯定水平上将会成为你进入华为从事软件开发的一个直通车。
所以大家能够关注一下相干的一些培训认证的信息,去找到一个适宜本人的方向,而后去在一个更大的舞台上,咱们一起来构建华为鲲鹏的软件生态环境,让华为鲲鹏做得越来越好。
点击关注,第一工夫理解华为云陈腐技术~