鲲鹏HCIP 高阶鲲鹏代码移植23+鲲鹏应用发布18"/>
2 华为鲲鹏HCIP 高阶鲲鹏代码移植23+鲲鹏应用发布18
3 高阶鲲鹏代码移植:23
4 鲲鹏应用发布:18
1 代码移植
1 应用执行过程
1 ISA指令集体系结构,instruction set architecture: ISA是软件和硬件之间接口的一个完整定义。
2 程序编译过程:
① 从高级语言转为汇编语言 l 汇编语言是指令集的一种体现形式,是直接面向处理器的程序设计语言 l 不同的指令集对应不同的汇编语言 l 编译器将高级语言翻译为汇编语言 ② 从汇编语言转为机器语言 l 机器语言是指令集的另外一种体现形式 l 汇编指令是机器指令便于记忆的书写格式 l 机器语言使用的是 CPU 能够识别的二进制2 基于ARMV8的汇编语言简介:
1 ARMv8的运行模式:在ARMv8架构中,原先ARMv7架构中的Thumb指令被称为:T32
l AA rch64在本模式下,所有地址保存在64位寄存器中,基本指令集可以使用64位寄存器来处理。AArch64状态下的指令集称为A64。
l AA rch32在本模式下,所有地址保存在32位寄存器中,基本指令集可以使用32位寄存器来处理。AArch32状态下的指令集可分为A32和T32。
运行模式 | 寄存器位数 | 指令集 | 指令长度 | 备注 |
AArch64 | 64位 | A64 | 32位 | 使用定长指令 |
AArch32 | 32位 | A32 | 32位 | 使用定长指令 |
T32(ARMv7中的Thumb) | 32位和16位 | 混合了16位和32位指令 |
1 ARMv8特权级别划分:级别最高的是EL3
l ARMv8 将特权级别分为 4 个 level , 分别是 EL0 , EL1 , EL2 , EL3 。 而每个 level 的特权不一样的,特权大小 EL0 < EL1 < EL2 < EL3 。 l 不同的 level 之间使用异常( exception )进行切换2 Normal world和secure word:
l 为了保证数据的安全,在 Normal world 中运行的程序不能直接访问 Secure World 中的资源,必须要使用 SMC 指令切换到 Secure World 才可以访问。 l 如果开发者在设计应用时涉及到了安全服务时,例如加密解密等,需要关注此方面的知识。 l 通常情况下,开发者不会需要直接和 Secure World 进行交互,而是使用例如 authenticate ()这类的 Normal World 提供的高级 API 进行和 Secure World 。4 ARMv8的通用寄存器:
l 每个特权级别下都有 31 个通用寄存器 l 64 位的寄存器的命名以“ x ”开头: X0-X31 l 32 位的寄存器的命名以“ w ”开头5 ARMv7的CPU模式:哪个中断,仅能运行在安全模式?MON
哪个中断,仅能运行在非安全级别?HYP
其他:既可以在安全模式,也可以在非安全模式
6 ARMv8中,哪些汇编语言正确使用了MOV指令?MOV X0,X1 //将X1中的,复制到X0
6 数据处理技术:
l SISD ―― 指令部件只对一条指令处理,只控制一个操作部件操作 . l SIMD ―― 由单一指令部件同时控制多个重复设置的处理单元,执行同一指令下不同 l 数据的操作。2 ARMv8 A64基本指令集,正确的是:ARMv8的指令集向下兼容了ARMv7
1 数据处理指令
2 内存访问指令: 将内存中的数据,加载到寄存器中的指令:LDR Rt, Dt
3 流程控制指令
4 系统控制指令
5 伪指令:
6 NEON简介:
l ARM 高级 SIMD 指令称为 NEON 。 l NEON 指令支持 AArch32 和 AArch64 。 l AA rch32 运行模式下的 NEON 相当于 ARMv7 中的 NEON 。3 鲲鹏应用开发:
1 基于编译型语言
大部分应用可以通过重新编译即可移植到鲲鹏平台 少部分应用需要通过二次开发修改代码才能移植到鲲鹏平台 内联SIMD intrinsic移植:现有一个X86平台的软件,软件中使用了intrinsic指令,现在客户希望在鲲鹏平台使用这个软件,应该用哪种加速库为客户做迁移:avx2Neon2 基于解释型语言
1 JVM设置(3个经验+2个差异)
3个经验:
完成一次GC后,释放70%的堆空间;
假设老年代内存占用为X:
空间 | 倍数 | 参数 |
堆总大小 | X的3-4倍 | Xmx,Xms |
年轻代 | X的1-1.5倍 | Xmn(NewSize+MaxNewSize) |
老年代 | X的2-3倍 | 堆和年轻代相减(Xmx-Xmn) |
永久代 | X的1.2-1.5倍 | PermSize,MaxPermSize |
年轻代大小,占整个堆空间的3/8
2个差异:
差异1:线程栈大小的Xss参数在ARM上默认值为2M,在X86上为1M,若线程开的太多,需要使用Xss调整线程栈的大小,防止OOM
差异2:由于ARM和X86指令集的差异性,导致JDK的JIT编译存在差异。可以通过设置参数ReservedCodeCacheSize,调整CodeCache大小。
3 在将X86代码移植到鲲鹏920平台时,当涉及到内联SIMD,在进行gcc编译时,需要添加什么参数?-march=armv8-a+fp+simd+crypto+crc
4 在鲲鹏架构下,以下哪条汇编指令是做or运算的?EOR Vd, Vn.,Vm
5 在鲲鹏平台上准备C语言的开发环境,需要部署以下哪个工具:GCC
6 在鲲鹏平台上进行编译时,定义编译生成的应用程序为64位的参数:-mabi=lp64
7 在使用NEON时,定义了一个向量的格式为x_t,其中numbers_of_lanes指的是:Lane的数量
8 在鲲鹏分布式存储解决方案场景中,发现某块磁盘成了该集群的性能瓶颈,该如何解决:考虑更换磁盘
9 在提高并行线程数的同时,还是注意尽量减少线程之间的:锁争抢。
10 在相同规格的条件下,下列哪种类型的弹性云服务器实例的计算性能最强:H3
11 在用户访问web服务器时候,鲲鹏SSL加速引擎被部署在哪里?负载均衡/ELB
4 多选
1要将以上代码片段移植到鲲鹏平台时,哪些地方需要修改?
将printf("x86_64 is defined\n");修改为printf("aarch64 is defined\n"); 以及#ifdef x86_64修改为#ifdef aarch64
#include
int main(){
#ifdef x86_64
printf("x86_64 is defined\n");
}
注意:将x86_64转换成aarch6
2 ARMv8定义的内存屏障体系结构提供了那些功能?load/Store指令的排序、流水线的排序
3 将Java开发的程序从x86移植到鲲鹏处理器,需要修改的地方有:
重新编译So库、需要安装ARM版本的JDK,将JVM的参数修改为适合鲲鹏处理器以获取最好的性能。
4 将X86平台的代码一直到鲲鹏平台时,替换汇编指令的方法有哪些?
如果有相同功能的ARM汇编指令,则直接替换;
如果没有相同功能的ARM汇编指令,则重新开发代码来替换
5 在鲲鹏平台,将变量类型为double的转化为long型,则可能的结果为:
0x7FFFFFFFFFFFFFFF、0x8000000000000000
0x7FFFFFFFFFFFFFFF:鲲鹏为long变量,赋值大的正数
0x8000000000000000:鲲鹏为long变量,赋值小的负数
6 在鲲鹏平台,double值转为int,则可能的结果为:
0x7FFFFFFF、0x80000000
0x7FFFFFFF | 鲲鹏为int变量赋值大的正数 |
0x80000000 | 鲲鹏为int变量赋值小的负数 |
7 在鲲鹏平台部署Python开发环境时,在开发环境部署的准备阶段,应该识别以下那些问题?
Python3在设计的时候没有考虑向下兼容;
确认需要使用的Python版本;
为了保持代码一致性,Python2所用的版本,在升级Python3后保持不变;
Python2已于2020年1月停止维护
8 在使用rpmbuild打包应用时,需要编辑spec文件,以下选项中,参数设置正确的是:
Licenses;
Source0;
Name;
Version
9 ARM指令集从v7开始分了不同版本,其中,A系列(Application)针对复杂计算领域,如:智能手机、服务器
R系列(Real time):针对需要实时响应的,如:医疗设备、汽车制动;
M系列(Microcontroller):针对功能、尺寸有一定要求的,如智能家居、通讯模块
10 AVX2NEON加速库,对哪些指令进行了封装移植?
SSE;
AVX2;
AVX512
11 CloudIDE是DevCloud的云端开发环境,向开发者提供按需配置、快速获取的工作空间(包括编辑器和运行环境),以下哪些是CloudIDE的主要功能?
支持完成环境配置;
支持代码阅读和编写;
支持对接多种代码仓库;
支持代码构建、运行和调试
12 Django是一个高级的Python网络框架,可以快速开发安全和可维护的网站。以下关于Django的说法,正确的是:
Django是免费和开源的项目,有活跃繁荣的社区;
Django开源社区提供的解决方案,也全部都是免费的;
Django负责处理网站开发中复杂部分,因此软件开发人员可以专注于编写应用程序
13 dnf相比于yum的优势是什么?
dnf在同步存储库的元数据时,使用的内存较少;
dnf支持多种扩展
14 GCC(The GNU Compiler Collection)是GNU开发的编辑器套装,它支持的处理器架构种类很多,包含以下哪些处理器架构?
X86;
ARM;
ALPHA;
MIPS
15 GCC编译器能够为许多不同的机器生成代码,其支持以下哪些语言?
Java;
Matlab;
Fortran;
C/C++
16 将java代码从X86移植到鲲鹏处理器时,需要修改的地方有:
将JVM参数,修改为适合鲲鹏处理器,以获取最好的性能;
需要安装ARM版本的JDK;
重新编译So库
17 下列选项中,哪些操作系统支持rpm软件管理工具?
Centos;
OpenEuler;
Suse;
Redhat;
Fedora
哪个不支持?Ubuntu
18 使用rpm2cpio/cpio命令,解压rpm源码包后,通常会得到以下哪些文件或源码包?
tar.gz源码包;
spec文件;
patch补丁文件
19 提供单指令、多数据、即SIMD指令的处理器可以提升一下哪些种类的应用程序的执行速率?
视频数据程序、声音数据程序、处理影响的程序
20 通过以下哪些方式,可以构建软件的二进制RPM包?
使用rpmbuild -ba命令从spec文件构建;
使用rpmbuild -rebuild命令从srpm重新构建;
使用rpmbuild -bb命令,从spec文件构建
21
2 鲲鹏应用发布
1 应用发布流程介绍:
l 应用开发 p 按照需求,选择开发语言及开发环境进行开发 p 如在鲲鹏平台使用 C 语言开发一个应用 l 应用打包 p 根据开发语言及需求进行应用程序的打包 p 如 C 语言一般使用 rpm 打包、 JAVA 使用 jar 命令打包等 l 配套文档编写 p 应用发布前对配套文档的制作,如版本说明、使用说明、功能说明等 l 应用发布 p 选择合适的途径和平台进行发布注意:鲲鹏应用发布,需要提供完整的说明文档及源码包
2 主流语言的打包工具和方法:
C 语言 工具: rpmbulid 方法:使用 rpmbulid 命令把编写好 SPEC 文件进行构建打包 输出: rpm 包 JAVA 工具: Maven 工具, Jar 命令 方法:配置 pom.xml 文件,使用 mvn package 打包 输出: jar 文件 Python 工具:原生库 distutils ,扩展库 setuptools 等 方法:使用库编写打包脚本,使用命令打包 输出: tar.gz 文件2.1 在基于编译型语言的鲲鹏应用发布流程中,编译阶段最关注的是:编译后的二进制文件是否成功运行。
3 RPM:
1 RPM
1 RPM ( Redhat Package Manager )是 openEuler 、 Redhat 、 CentOS 、 Fedora 等 Linux 操作系统中的 软件包管理器。 2 RPM 所涉命令集: rpm :用来手动安装、卸载、查询、升级 rpm 包 rpmbuild :用来把源码编译成 RPM 包(构建rpm包) rpmdevtool :用来创建 rpmbuild 目录、 SPEC 文件等 3 RPM 具备以下优点: 内含编译程序,免编译。 预先检查系统版本,可避免文件被错误安装。 提供软件版本资讯,软件名称软件用途等相关信息,便于了解软件。 使用数据库记录 RPM 文件的相关参数,便于升级、移除、查询与验证。2 RPM命令集
1 命令格式 rpm [OPTION…] 2 部分参数说明 - ivh // 安装并显示安装进度和详细信息 - qa // 列出已安装在本机上的应用 -Va // 列出本机上可能被修改过的应用 -e // 卸载应用3 rpmbuild参数命令:
1 命令格式 rpmbuild [OPTION…] 2 部分参数说明 -bp // 只作准备 (解压与打补丁) - bc // 准备并编译 -bi // 编译并安装 -bl // 检验文件是否齐全 - ba // 编译后生成* .rpm 和 src.rpm -bb // 编译后生成* .rpm -bs // 只生成* . src.rpm4 rpmbuild目录介绍
rpmbuild 目录是可以由命令 rpmdev-setuptree 自动生成 Rpmbuild 目录的具体路径及用途 如下: 路径 | 宏代码 | 名称 | 用途 |
~/rpmbuild/SPECS | %_specdir | Spec 文件目录 | 保存 RPM 包配置(.spec)文件 |
~/rpmbuild/SOURCES | %_sourcedir | 源代码目录 | 保存源码包(如 .tar 包)和所有 patch 补丁 |
~/rpmbuild/BUILD | %_builddir | 构建目录 | 源码包被解压至此,并在该目录的子目录完成编译 |
~/rpmbuild/BUILDROOT | %_buildrootdir | 最终安装目录 | 保存 %install 阶段安装的文件 |
~/rpmbuild/RPMS | %_rpmdir | 标准 RPM 包目录 | 生成/保存二进制 RPM 包 |
~/rpmbuild/SRPMS | %_srcrpmdir | 源代码 RPM 包目录 | 生成/保存源码 RPM 包(SRPM) |
5 rpm应用制作流程
1 准备测试代码
2 创建rpmbuild目录:
rpmdev-setuptree
3 将测试代码移动到rpmbuild目录
cd /root
mv mysql-boost-8.0.17.tar.gz /root/rpmbuild/SOURCES/
mv 0000-mysql-add-fstack-protector-strong.patch /root/rpmbuild/SOURCES/
4 制作SPEC,并修改
cd /root/rpmbuild/SPECS/
rpmdev-newspec mysql
cd /root/rpmbuild/SPECS
vim mysql.spec
5 rpm打包
使用命令rpmbuild进行rpm包的创建
- ba 参数表示创建可执行应用的同时,生成 rpm 的源码包 - nodebuginfo 表示生成的包不可以使用 gdb 调试rpmbuild -ba mysql.spec
rpm安装生成的应用:
rpm -ivh /root/rpmbuild/RPMS/aarch64/hello-1.0-1.aarch64.rpm
6 测试
6 在rpmbuild的SPEC目录下,SPEC配置文件中,用于将软件构建成机器代码(对于编译语言)、或者字节码的(对于解释型语言)的命令是哪个?%build
7 在rpmbuild的SPEC目录下,spec配置文件中的哪个参数,用来记录软件包在不同版本version或内部release版本之间的变更?%changelog
4 Maven
0 Jar文件制作
JAVA 开发的应用在发布前通常会打包一个 JAR 文件, JAR ( Java ARchive )是将一系列文件(包含库、依赖文件等)合并到单个压缩文件里。 手动制作:早期使用jar 命令制作 JAR 文件,所有的编译、测试、代码生成、打包等工作需要手动重复执行,效率较低,出错的机率较高 自动生成:借助Maven 等工具,自动进行软件包生命周期的管理,从而提高工作效率,降低出错的机率 • 程序开发的过程当中,构建工程,编写代码, 测试代码, 打包,部署,上线等每天都是重复工作。在传统过当中需要手工的去操作, 那么效率是低效的。 • 自动化构建工具 Maven 一键全自动完成 构建工程,编写代码, 测试代码, 打包,部署,上线等工作,那么效率是高效的。1 Maven介绍
1 Maven 是 Apache 下的一个纯 Java 开发的开源项目,基于 项目对象模型 (缩写: POM ),可以对 Java 项目进行构建,依赖管理。 2 Maven 官网链接: / 3 Maven 下载链接: .cgi 4 Maven 安装指导: .html2 POM文件介绍:
Maven工程中pom文件的作用:确定项目依赖的文件,提供快速研发
Pom ( project object model )是 Maven 工程的基本工作单元,是一个 XML 文件,包含了项目的基本信息,用于描述项目如何构建,声明项目依赖等。以下为 pom 文件的部分内容: modelVerion :模型版本,目前是 4.0.0 groupId :组织 id ,一般是一个公司域名的倒写 artifactId :项目名称,自定义生成 version :项目的版本号,如果项目仍然处在开发阶段,通常在版本中带有 -SNAPSHOT groupId 、 artifactId 和 version 组成了坐标,是一个项目的唯一标识3 Maven仓库
4 鲲鹏Maven仓库:
鲲鹏 Maven 仓库提供了适配鲲鹏平台的 so 库,开发者可以直接调用,无需进行重新编译 鲲鹏 Maven 仓库链接: / 。 在鲲鹏应用开发时,建议将远程仓库配置为优先搜索鲲鹏 Maven 仓库 修改 settings.x ml 文件 在 profiles 便签下增加鲲鹏 Maven 仓库的信息,包括 id 、 url 将鲲鹏 Maven 仓库的信息放在第一位,使其可以被优先使用5 Maven生命周期
6 Maven打包:开发、打包、安装
7 鲲鹏应用构建流程
8 Maven构建工程骨架:mvn archetype: generate
9 在Maven工程的目录结构中,Resources的功能是什么?存放配置文件,例如xml类型等。
5 发布后期维护,描述正确的是:对生命周期进行管理,到期即下线所有版本
X 多选
1 Maven全局配置文件settings.xml文件与.m2中的配置文件settings.xml的区别是什么?
2个settings文件同时存在;
Maven全局settings.xml文件,对系统内所有用户生效;
.m2中settings文件只对当前用户生效
2 rpmbuild的SPEC文件的功能是什么?
说明软件包的属性;
说明软件包怎样被配置、安装哪些文件以及被安装到哪里;
声明软件的许可证
3 rpm软件管理工具的功能包括哪些?
查询和验证;
安装;
卸载;
升级
4 rpm软件管理工具的优势有哪些?
提供软件版本资讯、软件名称和软件用途等相关信息;
使用数据库记录rpm文件的相关参数,便于升级、移除、查询与验证;
该工具包含了编译程序,免编译;
预先检查系统版本,避免错误安装
5 rpm软件管理工具如何区分源码文件与二进制bin文件?
软件包的后缀是否为.rpm;
软件包的后缀是否为.tar.gz.zip
6 Java常用的开发配套工具有:
ant;
gradle;
maven
7 代码归一实现的方式有3个:
代码段编译宏控制;
编译文件Makefile控制;
运行态自动适配
错误的:添加自动识别硬件的代码进行自动控制
8 对MySQL内存优化的参数有哪些?
innodb_buffer_pool_size;
innodb_buffer_pool_instance
9 基于变异性语言(C/C++)的鲲鹏应用程序发布时,下列哪些环节属于该流程?
将源代码编译成二进制文件;
将源代码打包成rpm包
不属于该流程的是:
源代码打包成二进制需要对平台进行编译,但最终的结果不会影响我们发布在鲲鹏平台下执行程序;
将源码打包生成rpm包的同时,注意版本号。
更多推荐
2 华为鲲鹏HCIP 高阶鲲鹏代码移植23+鲲鹏应用发布18
发布评论