【云驻共创】鲲鹏DevKit实现两人天高效迁移汇编代码
一、鲲鹏之志
1.1 鲲鹏平台
鲲鹏平台,为全世界的开发者提供了一种新的算力选择。从硬件的开放,到系统软件的开源,涵盖从底层硬件、基础软件到上层行业应用的全产业链条,在国计民生的各个行业取得了重大效果或者进展。工欲善其事必先利其器,鲲鹏开发套件Kunpeng DevKit是华为公司为了广大鲲鹏开发者打造的一把屠龙之刃,帮助开发者高效开发,一键迁移。
1.2 Kunpeng DevKit
鲲鹏开发套件Kunpeng DevKit提供全栈开发工具,集代码迁移、编译调试、性能调优、异常诊断等工具和功能于一体。将开发者的工作各个环节一一串联,提供了一个方便、快捷和专业的工具包,通过鲲鹏DevKit可以帮助用户高效开发,一展宏图。
真正的武林高手,内功很强,外功同样很强!DevKit产品设计和用户体验同样优秀!
时间有限,本文着重分享汇编翻译技术和Kunpeng DevKit产品体验。
二、汇编自动翻译
2.1 汇编代码
众所周知,汇编语言历史悠久,上手难度较高,是任何一种计算机或其他可编程器件的低级语言。在不同的设备中,汇编语言对应着不同的机器语言指令集。
一种汇编语言专用于某种计算机系统结构,如x86_64或aarch64汇编。这意味着在某种程度上汇编语言可以真正的操控硬件,可以完成高级语言不能完成的任务。同样,正因为汇编语言接近硬件平台,所以汇编语言也是晦涩难懂、难以上手。
2.2 汇编样式
每一个计算机平台都对应着自己的计算机平台,内存、寄存器等语法格式错综复杂。
汇编语言使用方式也多样,单指令简单嵌入汇编、多指令简单嵌入汇编、全汇编文件。这相当于在我们现代社会讲古文古诗,全篇都使用文言文或者其中引用两句古诗词。
2.3 意义和挑战
将代码从一个平台迁移到另一个平台,如果其中需要牵涉到汇编语言翻译,其代码迁移难度巨大。
目标是两人天完成应用迁移,然而如果代码中包含汇编语言,有可能12人都无法完成迁移。不行,不可以!华为必须开发汇编迁移工具!
“代码千万行,汇编就几行,迁移没工具,开发泪两行”
2.4 使用场景
在使用汇编语言时,嵌入汇编的指令数大部分是小于三条指令,使用都较简单,指令也比较集中。
全汇编文件中SIMD指令占了绝大多数,指令相对集中。
可以发现,常用汇编指令和SIMD指令占了汇编语言大半江山。只要能够解决常用指令和SIMD指令,项目就成功了一大半。
2.5 总体思路
目标是识别所有X86汇编,自动翻译(大多数场景且性能尽量不衰减)。
在开始时,对于常用的指令进行翻译,而后随着用户规模的扩大和使用量的增加,根据用户需求,逐步加入用户所需要的指令。
第一个技术点:自动化
第二个技术点:技术复用
整体技术架构面向未来,拥有生命力。所有就有了下列设计原则
设计原则
- 使用便利 - 一键迁移
- 可扩展性 - 翻译范围
- 可维护性 - 源码翻译
- 架构重用 - 不同场景
- 技术复用 - 不造轮子
2.6 总体设计
W + 二
“二”,直接翻译,实现从X86-64 → AArch64
“W”,庖丁解牛,虽然操作较为复杂,但是利用编译技术的现有能力,加以改造为翻译所用,实现翻译效率最优化。依据上文所述汇编复杂特性以及平台便捷化目标,产生以下设计原则和设计方案
设计原则
- 汇编样式复杂
- 平台间差异大
- 目标要求很高
设计方案
- 能用则用
- 需改尽改
- 当快则快
- 曲折前行
三、汇编自动翻译部分技术
3.1 嵌入汇编的识别
对于全汇编,识别方式较为简单,通过文件的后缀即可识别汇编文件,问题在于嵌入汇编的识别。我们使用Clang-Tidy编译技术实现该目标。
Clang-Tidy:基于LLVM的静态语法检查框架,提供语法(AST)解析能力。
基于Clang-Tidy工具集拓展汇编识别和替换规则,使得AST关键节点暴露。定位汇编代码后即可为所欲为,进行翻译处理。
识别流程图如下:
下面给出一个小案例:
3.2 简单嵌入汇编的自动翻译
基于规则的自动翻译,即通过某种特征匹配规则识别和转换相应的代码。
1.指令操作数映射
2.汇编语句特征分析(绑定步骤1)
3.规则库规则匹配(绑定步骤2)
4.根据规则进行代码翻译
首先对汇编语句进行语法解析,解析完以后可以得到各个特征,再在规则库中进行特征规则匹配,即与语法结构进行匹配,在规则进行转换时,相对应的语法结构也进行转换,两者合一,即代码翻译完成。
3.3 复杂汇编的自动翻译
对于复杂汇编,指令条数多,语法结构复杂,千变万化,也可能存在外部引用等问题。
1.指令组合无法穷举
2.汇编模块引用外部变量
3.消除平台间调用差异
4.SIMD指令对等翻译
上文中“W + 二”设计结构在复杂汇编翻译中发挥重要作用。下“一”进行SIMD直接翻译。
3.4 汇编翻译举例
将X86-64一键翻译为AArch64,并且提供两种方案,旧的路径依旧可以在X86上执行,没有任何问题,并且创建的新分支可以运行在Kunpeng平台上。生成代码后,可以一键替换掉旧代码。提供一个main函数,可以看作一个驱动,测试驱动可以在X86和Kunpeng平台同时运行。运行结果一致。保留X86平台的兼容性,代码在不同的平台运行可以保持100%的兼容和正确。
简单汇编翻译:
复杂汇编翻译:
天啦,这也太快了。朋友们,赶紧下载使用吧,一键翻译,迁移你的应用至鲲鹏平台。冲起来!
四、体验设计
Kunpeng DevKit功能强大,使用优雅。采用超级方便的一站式解决方案,帮助开发者加速软件开发、迁移和算力升级。一站式开发套件、全流程效率提升。一站式迁移、编译、测试、分析。
4.1 应用迁移体验设计
开发者依照个人经验和习惯可以大致分为三类:
经验较少的用户,重度依赖自动化,希望全自动化迁移
有一定经验,合理依赖自动化,希望自己主要迁移过程
经验丰富,浅度依赖自动化,自己纯手工迁移
鲲鹏DevKit针对上述三种不同类型的用户,做了大量产品体验层的设计。
第一类开发者,通过系统全面自动化能力,做到无感知迁移。提供动态二进制翻译工具,自动的将X86平台指令集翻译成Kunpeng平台指令集。整个过程透明、全自动,无需额外工作,整个应用即可应用在Kunpeng平台上。
第二类开发者,希望参与整个应用迁移的过程和环节中,了解翻译过程。鲲鹏DevKit自动识别问题、提供建议辅助决策、提供替换代码─键修改,极简体验。
第三类开发者,可能存在开发者认为自动化重构是一个黑盒子,不可信任,在这方面,困DevKit提供了透明展示等内容,使得用户相信,该工具是安全的。
4.2 性能调优体验设计
设计架构时,将人的思想行为融入其中,使得工具的使用更加自然化、更加符合人类认知的思考,从整体到局部,从宏观到微观。
4.3 小例子
举几个小例子可以说明上述体验设计,一个是硬件调优3D可视化,基于认知模型、表现模型极简抽象,从物理世界到虚拟世界的映射。
第二个例子是性能分析时,进程/线程拥塞的直观可视化。
在系统设计时,运行大量的信息可视化表达,一目了然,清晰可见,优雅体验。
五、总结
无需多言,一图流概括!
鲲鹏DevKit产品从设计到功能都是极好的,可以发现为了鲲鹏的发展和壮大,华为在此花了很多心思,希望各位开发者朋友们多多尝试,或许鲲鹏比你我想象的更加强大、友好、便利。
“北冥有鱼,其名为鲲。鲲之大,不知其几千里也。化而为鸟,其名为鹏。鹏之背,不知其几千里也;怒而飞,其翼若垂天之云。”
附:华为云直播2人天应用迁移无忧:鲲鹏DevKit 开发套件黑科技解读(国内),点此回看
查看活动:https://bbs.huaweicloud.com/blogs/266530
- 点赞
- 收藏
- 关注作者
评论(0)