Android ART在玄铁C910上的移植和性能优化

描述

在过去的3年里,我们在玄铁C910上分别移植了Android 10和Android 12,在ART上我们也做了一些更加深入的优化。在今年 RISC-V 美国峰会上,我们介绍了在ART上移植和优化过程和最近进展,在本文中也将分享这些工作。

在进入ART优化工作介绍前,先简单看一下ART是什么。在Android中,所有的程序都是基于java来编写的,Android SDK会把java字节码转换成dex字节码。那么Android中的程序都离不开dex虚拟机。在Lolipop采用的是dalvikvm,而从Lolipop开始,ART替代了dalvikvm。

ART的执行的过程概述

相比于dalvikvm,ART在最开始的时候(Lolipop),引入全新的执行模式AHead-Of-Time(AOT)。应用程序在安装过程中,其.dex字节码会被编译成machine code,应用程序会以machine code的方式执行,大大提高了程序的执行效率。

纯AOT的方式会使程序的安装过程变得非常长,因此在Android N的时候,引入新的JIT执行流程。在JIT执行模式下,应用程序的dex字节码(cold)会先通过解释器(interpreter)进行解释执行,当发现其中的方法是热点方法(hot)时,ART的JIT编译器就会开始工作,将热点方法编译成machine code。在后续调用到该热点方法时,将会采用machine code进行执行。

Android

ART for RISC-V 支持

在介绍完ART在Android上的基础工作原理后,再来回顾一下玄铁团队在两个Android版本上的支持情况。

Android 10支持

2020年的时候,我们就开始了在Android 10上支持 RISC-V 的工作。前期工作主要包括内核和驱动程序的准备,Clang编译器和build系统的支持,Bionic库支持,Shell启动支持。

在此基础上,ART先实现了JNI calling Convention和一些Runtime接口的支持,可以在20分钟左右能启动到Launcher界面。我们先后在ART上采用RV64GC指令集增加了Mterp汇编解释器以及JIT/AOT编译器,基于这两个编译器的优化,极大提高了Launcher启动时间,分别提高到10分钟和1分钟。

Android

Android 12支持

2022年开始,我们又在Android 12上再一次支持了 RISC-V。有了前一次经验,在Android 12上的支持变得轻车熟路。相比于Android 10的移植工作,这一次有了新的硬件平台TH1520,同时更新了Clang编译,并采用玄铁优化的Clang15版本,也更新了Binonic。

在ART上,本次增加Nterp解释器,用于减少方法调用的链路,提高频繁方法调用场景下的性能。由于采用Clang15编译器支持了玄铁扩展指令集,因此在ART上也增加这一部分针对玄铁的特性优化。经过一系列的优化工作以后,Android 12在TH1520上在开启更多的服务的情况下,Launcher启动时间再一次得到提升,达到了47秒。

Android

社区贡献

在移植Android的过程中,我们也积极参与社区的贡献,避免大家重复造轮子。自2022年9月,我们在AOSP社区开始陆续提交相关的Porting改动。在ART上,目前贡献超过了80个Commit。特别感谢来自Google的Vladimir Mark、Ulya Trofimovich和Santiago Aboy Solanes细致的代码审查工作,完成代码review、验证以及修改,保证代码高质量合入。

Android

玄铁扩展指令集优化改进

在最近的优化工作中,我们在ART中增加了玄铁扩展指令的支持。玄铁扩展指令主要分为整数计算、内存读写、bit操作以及Vector v0.7指令集。基于这些指令集,ART中的优化内容包括编译器部分的优化器、指令生成器,运行时库的汇编解释器、Quick Entries等等。除了在ART采用玄铁扩展指令集进行优化以外,还在Bionic中对C库、数学库进行了优化。

Android

玄铁扩展指令相比于RV64GC指令集,有较大的性能收益:

Caffeine Mark,对于整数部分有超过15%的性能提升,对于浮点,方法调用也有4%的提升

SCIMath2,大部分用例都有超过15%的性能提升,小部分SOR/Monte Carlo提升并不明显

其他一些编程语言上的结果也有较大的提升,最高的能达到约5倍

Android

结语

RISC-V 在Android上才刚刚起步,ART上还有很多软件、硬件的优化需要继续支持。非常幸运能参与这一历史性的事情,与全球开发者共同推动Android在 RISC-V 上的适配。

希望社区里有兴趣的同学可以关注 RISC-V Android SIG以及Google RISCV64社区,共同讨论参与贡献。

 

  审核编辑:汤梓红

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

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分