在過(guò)去的3年里,我們?cè)谛FC910上分別移植了Android 10和Android 12,在ART上我們也做了一些更加深入的優(yōu)化。在今年 RISC-V 美國(guó)峰會(huì)上,我們介紹了在ART上移植和優(yōu)化過(guò)程和最近進(jìn)展,在本文中也將分享這些工作。
在進(jìn)入ART優(yōu)化工作介紹前,先簡(jiǎn)單看一下ART是什么。在Android中,所有的程序都是基于java來(lái)編寫(xiě)的,Android SDK會(huì)把java字節(jié)碼轉(zhuǎn)換成dex字節(jié)碼。那么Android中的程序都離不開(kāi)dex虛擬機(jī)。在Lolipop采用的是dalvikvm,而從Lolipop開(kāi)始,ART替代了dalvikvm。
ART的執(zhí)行的過(guò)程概述
相比于dalvikvm,ART在最開(kāi)始的時(shí)候(Lolipop),引入全新的執(zhí)行模式AHead-Of-Time(AOT)。應(yīng)用程序在安裝過(guò)程中,其.dex字節(jié)碼會(huì)被編譯成machine code,應(yīng)用程序會(huì)以machine code的方式執(zhí)行,大大提高了程序的執(zhí)行效率。
純AOT的方式會(huì)使程序的安裝過(guò)程變得非常長(zhǎng),因此在Android N的時(shí)候,引入新的JIT執(zhí)行流程。在JIT執(zhí)行模式下,應(yīng)用程序的dex字節(jié)碼(cold)會(huì)先通過(guò)解釋器(interpreter)進(jìn)行解釋執(zhí)行,當(dāng)發(fā)現(xiàn)其中的方法是熱點(diǎn)方法(hot)時(shí),ART的JIT編譯器就會(huì)開(kāi)始工作,將熱點(diǎn)方法編譯成machine code。在后續(xù)調(diào)用到該熱點(diǎn)方法時(shí),將會(huì)采用machine code進(jìn)行執(zhí)行。
在介紹完ART在Android上的基礎(chǔ)工作原理后,再來(lái)回顧一下玄鐵團(tuán)隊(duì)在兩個(gè)Android版本上的支持情況。
Android10支持
2020年的時(shí)候,我們就開(kāi)始了在Android 10上支持 RISC-V 的工作。前期工作主要包括內(nèi)核和驅(qū)動(dòng)程序的準(zhǔn)備,Clang編譯器和build系統(tǒng)的支持,Bionic庫(kù)支持,Shell啟動(dòng)支持。
在此基礎(chǔ)上,ART先實(shí)現(xiàn)了JNI calling Convention和一些Runtime接口的支持,可以在20分鐘左右能啟動(dòng)到Launcher界面。我們先后在ART上采用RV64GC指令集增加了Mterp匯編解釋器以及JIT/AOT編譯器,基于這兩個(gè)編譯器的優(yōu)化,極大提高了Launcher啟動(dòng)時(shí)間,分別提高到10分鐘和1分鐘。
Android12支持
2022年開(kāi)始,我們又在Android 12上再一次支持了 RISC-V。有了前一次經(jīng)驗(yàn),在Android 12上的支持變得輕車(chē)熟路。相比于Android 10的移植工作,這一次有了新的硬件平臺(tái)TH1520,同時(shí)更新了Clang編譯,并采用玄鐵優(yōu)化的Clang15版本,也更新了Binonic。
在ART上,本次增加Nterp解釋器,用于減少方法調(diào)用的鏈路,提高頻繁方法調(diào)用場(chǎng)景下的性能。由于采用Clang15編譯器支持了玄鐵擴(kuò)展指令集,因此在ART上也增加這一部分針對(duì)玄鐵的特性優(yōu)化。經(jīng)過(guò)一系列的優(yōu)化工作以后,Android 12在TH1520上在開(kāi)啟更多的服務(wù)的情況下,Launcher啟動(dòng)時(shí)間再一次得到提升,達(dá)到了47秒。
社區(qū)貢獻(xiàn)
在移植Android的過(guò)程中,我們也積極參與社區(qū)的貢獻(xiàn),避免大家重復(fù)造輪子。自2022年9月,我們?cè)贏OSP社區(qū)開(kāi)始陸續(xù)提交相關(guān)的Porting改動(dòng)。在ART上,目前貢獻(xiàn)超過(guò)了80個(gè)Commit。特別感謝來(lái)自Google的Vladimir Mark、Ulya Trofimovich和Santiago Aboy Solanes細(xì)致的代碼審查工作,完成代碼review、驗(yàn)證以及修改,保證代碼高質(zhì)量合入。
玄鐵擴(kuò)展指令集優(yōu)化改進(jìn)
在最近的優(yōu)化工作中,我們?cè)贏RT中增加了玄鐵擴(kuò)展指令的支持。玄鐵擴(kuò)展指令主要分為整數(shù)計(jì)算、內(nèi)存讀寫(xiě)、bit操作以及Vector v0.7指令集?;谶@些指令集,ART中的優(yōu)化內(nèi)容包括編譯器部分的優(yōu)化器、指令生成器,運(yùn)行時(shí)庫(kù)的匯編解釋器、Quick Entries等等。除了在ART采用玄鐵擴(kuò)展指令集進(jìn)行優(yōu)化以外,還在Bionic中對(duì)C庫(kù)、數(shù)學(xué)庫(kù)進(jìn)行了優(yōu)化。
玄鐵擴(kuò)展指令相比于RV64GC指令集,有較大的性能收益:
CaffeineMark,對(duì)于整數(shù)部分有超過(guò)15%的性能提升,對(duì)于浮點(diǎn),方法調(diào)用也有4%的提升
SCIMath2,大部分用例都有超過(guò)15%的性能提升,小部分SOR/MonteCarlo提升并不明顯
其他一些編程語(yǔ)言上的結(jié)果也有較大的提升,最高的能達(dá)到約5倍
結(jié)語(yǔ)
RISC-V 在Android上才剛剛起步,ART上還有很多軟件、硬件的優(yōu)化需要繼續(xù)支持。非常幸運(yùn)能參與這一歷史性的事情,與全球開(kāi)發(fā)者共同推動(dòng)Android在 RISC-V 上的適配。
希望社區(qū)里有興趣的同學(xué)可以關(guān)注 RISC-V Android SIG以及Google RISCV64社區(qū),共同討論參與貢獻(xiàn)。
審核編輯:湯梓紅
-
Android
+關(guān)注
關(guān)注
12文章
3935瀏覽量
127337 -
移植
+關(guān)注
關(guān)注
1文章
379瀏覽量
28124 -
編譯器
+關(guān)注
關(guān)注
1文章
1623瀏覽量
49107 -
RISC-V
+關(guān)注
關(guān)注
45文章
2270瀏覽量
46125
原文標(biāo)題:Android ART在玄鐵C910上的移植和性能優(yōu)化
文章出處:【微信號(hào):芯片開(kāi)放社區(qū),微信公眾號(hào):芯片開(kāi)放社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論