AssetBundle使用,卸載,校驗
745
2025-04-03
90%代碼如何移植到鯤鵬平臺上
介紹一下我名字叫張汝濤,現(xiàn)供職于華為智能計算,設(shè)計架構(gòu)與設(shè)計。主要是負責相關(guān)軟件產(chǎn)品的架構(gòu)設(shè)計以及功能開發(fā)。今天要講的主題是關(guān)于軟件遷移這一件事,是一個久遠的話題。因為但凡是牽扯到切換平臺、CPU架構(gòu)的變化,甚至一些語言版本的升級,我們都可能會面臨到一些軟件遷移的問題。今天就借著一個小時的時間,我們想探討一下軟件移植過程的原理,以及軟件工程的相應(yīng)的過程。
接下來要講一下我們鯤鵬在軟件移植的過程當中,如何去幫助開發(fā)者去提升效率,如何把我們鯤鵬沉淀下來的,把華為沉淀下來的軟件開發(fā)以及一致的經(jīng)驗如何反饋到開發(fā)者這里,讓開發(fā)者能夠加速軟件開發(fā)的進度,降低成本。接下來我們會推出我們鯤鵬的開發(fā)套件,幫助用戶做軟件的移植,以及做基于鯤鵬平臺的性能加速,今天主要是這樣三個內(nèi)容,我們下來就開始。
其實一提到軟件移植,我不知道大家有多少是做了比較底層軟件的,做底層軟件的話,大家可能會用到一些匯編,C++加這樣的底層語言。用到這種底層語言,它是會和機器的硬件架構(gòu)強相關(guān)的,當你在從一個平臺切換到另外一個平臺的時候,這些強相關(guān)的語言勢必要進行一次,跟我們所采用的編程語言以及移植的平臺環(huán)境強相關(guān)。當我們用匯編代碼或者是用這種編譯型語言的時候,我們就會面臨著一些移植的問題、一些挑戰(zhàn),有些問題可能通過編譯器能解決,有些問題特別是一些低階的代碼或者比較低級的一些代碼,底層的代碼不能說低階,我們就會可能要面臨著必須要手工去查手冊,然后去把它相應(yīng)的去轉(zhuǎn)換到新平臺所使用的機器碼。
這里就列出了一個我們鯤鵬處理器和x86處理器的一個指令差異,這里列了一個簡單的兩個數(shù)相加,兩個int型相加的這樣一個簡單程序。通過GCC編譯完之后,我們?nèi)ネㄟ^OMGD,我們就能看到指令的具體的格式形式以及相應(yīng)的對應(yīng)的匯編代碼。這里我們能看到我們看到對應(yīng)x86平臺而言,因為x86是CICS指令是復(fù)雜指令集,鯤鵬是完全兼容Arm64架構(gòu)的,是我們?nèi)A為自研的vinic,我們的指令集也是和Arm64副精簡指令集是完全兼容的。
這里插一下,講一下背景,其實所謂的經(jīng)限指定集和復(fù)雜指令集的區(qū)分是從上個世紀的70年代開始的,IBM曾經(jīng)做過一個研究,就是關(guān)于說CPU如何去高效的運行,然后他們會發(fā)現(xiàn)可能有些常用的指令或者是程序代碼,當時背景下常用的程序代碼,可能常用的和不常用的有很大的差異,當時又因為IC的制程或者工藝或者器件的設(shè)計水平?jīng)]有現(xiàn)在這么突飛猛進,所以就會想如何去把CPU從硬件設(shè)計上來講要簡單一點,從軟件上來講高效一點,所以他們就推出了提出了精簡指令集這么一個概念,其最大的特點一個顯著的特點就是它的指令寬度就是長度,我們說的指令長度,是相等的,也就說每一個指令這個位寬是相等的,么每個指令執(zhí)行的SICO幾乎也相同,就是他把很繁雜的事情做的盡可能的簡單,然后用很多簡單的操作去完成一件復(fù)雜的任務(wù)。
從相反的復(fù)雜指令集的角度,我們看一下x86下面的復(fù)雜指令級,它每一個指定的長度是不同的,也就是說像這里列舉的mov和add這兩個指令,它的機器碼、指令碼是不同的,長度是不同的,勢必會造成我們IC器件的解碼器,以及包括我們真正的到軟件流水操作上處理的步驟是不一樣的,也必然會導(dǎo)致我們每條指令的執(zhí)行的周期是不同的,但是這樣也有一個好處,就是我一個指令就能完成一個比較復(fù)雜的事情,盡管說我的指令可能會變得很長,但是我一條指令能完成一比較復(fù)雜的事情,對上層的程序員來講,可能就便于理解或者是相對的會容易理解一些。
這就是精簡指令集和復(fù)雜指令集的一個簡單背景,這里邊我們能看到,在我們反匯編下來的x86指令集和我們的鯤鵬指令集的匯編代碼上,我們看到我們的操作指令是完全不同的,我們的計存器的命名也是完全不同的,在x86的平臺上,我們有16個通用寄存器,我們講的是x86 64模式下,我們有16個通用寄存器,我們浮點計存器,根據(jù)我們支持的MMX技術(shù)或者是SSE或者是ABS技術(shù),我們x86平臺,x86?44的平臺,最多可以存在32個浮點寄存器。
反觀我們鯤鵬平臺,因為我們是和Arm64指令兼容的,所以指令集要事完全對照,所以從這個角度來講,我們鯤鵬平臺有31個通用寄存器,除了這31個通用寄存器以外,我們還有一些狀態(tài)寄存器或者是一個站寄存器,那對應(yīng)到浮點寄存器,我們就有32個這樣一個叫做ASMB的的advances單指令多數(shù)據(jù)這樣一個寄存器,我們有32個寄存器位,位寬是128。這一點是和x86?64平臺是有差異的,比如說現(xiàn)在x8664,它如果支持ABX512的話,它的位寬是500 12比特,從這個角度上,是一個硬件器件差異是非常明顯的。
然后從反匯編的角度來講,大家不知道有沒有注意到x86平臺上有一個mov指令。從第一行我們能看到從寄存器、rbp一個mov的存儲數(shù)據(jù),到EDX這樣一個寄存器,做一個從把變量從內(nèi)存里漏斗進來。同樣的一件事情在上面的鯤鵬處理器平臺上寄存器的指令就變成了LDR和然后下面當然加法還是有add的,然后存儲的時候?qū)τ趚86來講,又是從寄存器mov到了內(nèi)存力,但是對于鯤鵬平臺它是用一個str指令,所以這也反映出了一個risk指令的特點,也許是第2個特點,我們姑且這么叫,它是用一個load stall這樣一個模式,也就是說在鯤鵬處理器平臺上不支持內(nèi)存到內(nèi)存的一個直接訪問,必須要經(jīng)過一個寄存器作為橋接作為一個中轉(zhuǎn)。
這一點是和x86指令復(fù)雜型指令集不同的另外一個地方。還有就是在x86這個平臺上,它的內(nèi)存訪問的模式非常多,對于公共平臺上就沒有豐富了。這個就是以一個程序為例,我們簡單列舉一下,從我們CPU的角度來看,同樣是一段C代碼,CPU他做了不同的事情,執(zhí)行了不同的指令,經(jīng)過不同的周期不同的運算以后,它會輸出最終計算的一個結(jié)果。當然從這個角度來講,從這段程序兩個平臺是沒有任何差異的,除了指令上以外,執(zhí)行結(jié)果是不會有任何變化。
但這里也就側(cè)面反應(yīng)出來了,因為指令集不一樣,所以對于C,C++這樣偏底層的這樣一個語言來講,雖然它是個高級語言,但是我們必須要考慮一個平臺差異,在我們平臺切換的時候,甚至在我們平臺這個軟件的編制過程當中,我們要考慮一個平臺兼容性,所以要養(yǎng)成一個良好的編程習(xí)慣。
跨平臺移植軟件要面臨的不少問題,因為軟件移植本身就是一個工程性問題。我們這里通常第1步來講,如果說我們決定從x86平臺遷移到鯤鵬平臺,我們就要去判斷一下這個軟件遷移值不值得,困難有多大?我們通常目前的常用的做法就是我們把x86的平臺,相應(yīng)的軟件包拿下來,然后去看看它的依賴性關(guān)系。 他這個叫什么意思呢?就是我們看看這個軟件,如果跑在x86平臺上,他依賴哪些第三方組件?這些第三方組件在你這個目標平臺上存不存在要做一些這樣的判斷。這種判斷通常都是這個平臺之間的反反復(fù)復(fù)的安裝,去運行,然后根據(jù)系統(tǒng)報出來的錯誤去一個個來排除,所以這都是通過人工來完成的,這個比較費勁,如果有移植經(jīng)驗的同學(xué)就會覺得比較費勁,有些事情很繁瑣瑣碎,然后一個不小心就錯了,然后可能還找不出來了。
當你解決完第1步編譯的過程的這個問題之后,你可能會還碰到一些跑過,結(jié)果新平臺上出現(xiàn)了function fault。功能性錯誤我們就很討厭了,可能是原因比較多,有的是本身軟件邏輯有問題,第2個可能是第三方組件的APA跨平臺兼容性有問題,第3個可能是系統(tǒng)本身支持度也有問題,這個就是影響因素比較多,這樣子就需要移植之后,技術(shù)人員去相應(yīng)定位,定位對每個人對相應(yīng)的工程人員來講,專業(yè)技術(shù)要求會比較高,也存在著一個反復(fù)編譯、反復(fù)調(diào)整、反復(fù)驗證,這個過程成本會很高。
當你完成了功能驗證之后,你說跑過一些基本測試以后,你覺得這個軟件在新平臺上可以刊用了,你可能會面臨的一個性能的問題,當你用在工作環(huán)境、生產(chǎn)環(huán)境的情況下,因為生產(chǎn)環(huán)境的軟件都希望用最小的硬件跑出最大的性能,然后跑出最高的一個性價比,這時候都會對軟件性能上的需求,對他有要求。這個時候我們就會不得不去采取一些方法,例如用一些商業(yè)軟件也好,或者一些開源的軟件命令也好,去分析這個軟件的瓶頸到底是哪里有問題?是系統(tǒng)有配置的參數(shù)有問題,還是我軟件本身邏輯有問題?
所以這三步是我們在華為的軟件這么多年的開發(fā)過程當中積累下來覺得比較重要的三步,對我們軟件的質(zhì)量、移植的質(zhì)量是有決定性影響的。這三步也同時對于任何人來講,可能都不是一個能輕松逾越的幾個障礙。
再稍微解釋一下,對于我們軟件移植這件事情,通常我們講的是對于編譯型軟件會面臨這樣的一個困難,對于解釋性反而比較輕松,為什么?比如像我們現(xiàn)在常用的一些Java的或者Python的,甚至一些GOD這樣一些軟件,我們的依賴是什么?依賴的是語言所提供的虛擬運行環(huán)境,甚至是一些像Java提供的Java虛擬機GUM,我們只需要選一相應(yīng)平臺的GUM安裝,我們就能把底層的所有差異性都屏蔽掉。
這個軟件只根據(jù)運行環(huán)境去跑,通常是沒有問題的。對于像C,C++,GOD這種的,可能作為編譯,甚至說可能會調(diào)用C,C++加這種組件的這種軟件,我們就需要C,C++這種代碼進行移植,我們分這么幾種情況。
第1種是開源軟件,對我們通常是和社區(qū)進行合作,讓社區(qū)去支持空洞平臺,或者是支持M64的平臺,這樣我們就一勞永逸的解決問題。然后對于自研軟件,對于有些SB用戶會開發(fā)者資源軟件,他不能開放代碼,我們就需要進行商業(yè)合作,去引導(dǎo)客戶去移植到我們鯤鵬平臺上。
對于商業(yè)B軟件,我們最典型的,比如說像微軟的一系列軟件,或者是orico的軟件數(shù)據(jù)庫,我們不可能去獲得源碼,可能去推動他們和我們中國的軟件界合作,可能也非易事,這個時候你只能找到要么是合作,要么就是找一個替代方案,對吧?如果實在是又不能替換用戶的業(yè)務(wù),又不能去修改,我們就可能不得已采取一個鯤鵬平臺和x86進行一些混合部署,這是一個軟件部署方面的策略。
還有一種就是對于我們常用的windows平臺的一種系列開發(fā),我們也知道windows雖然一年多前可能說要支持Arm64這個架構(gòu),但實際上到現(xiàn)在為止他也沒有宣布。其實商業(yè)上的考慮或者是其他的因素可能都考慮的比較多,尤其是這樣一個大體量的公司,但是對于windows平臺就是說我們進行有限度的在開元生態(tài)里面進行有限度的支持,比如說像微軟的C?shut,其實他的call3.0已經(jīng)開源了,已經(jīng)在Arm平臺上能夠用起來了。換句話來講,我們也可以在鯤鵬平臺上基于call3.0支持C shut。對于我們鯤鵬軟件移植的過程,我們把它分解為這樣幾個步驟流程,其中最重要的就是我們這里所列到的第2步第3步以及性能達標分析這一步,我們現(xiàn)在提供了相應(yīng)的每一步提供一些的輔助工具去幫助客戶進行用戶開發(fā)者進行分析進行移植。
其中的二進制文件依賴掃描,是我們?nèi)ヌ峁┝艘粋€工序軟件進行軟件安裝、依賴庫的掃描和軟件運行依賴庫的掃描。根據(jù)我們長期積累的有一個兼容性清單,這個兼容性清單覆蓋了市面上大多數(shù)流行的以及常用的OS以及相應(yīng)的版本,還有相應(yīng)的GCC的版本,對于移植的第二階段,像移植修改C,C++原碼,我們也同樣提供了一款工具去做C,C++源碼的分析,這個分析主要是集中在這樣幾個方面,集中在匯編代碼、邊選項,還有宏定義,還有built in函數(shù)和編輯提供的built in函數(shù)和attribute,然后去重點檢查用戶的Makefile和CMakeList。如果用戶軟件是用make構(gòu)建的或者CMake構(gòu)建的,我們能幫助去發(fā)現(xiàn)一些,識別一些移植中需要修改的地方,同時我們會給出移植修改的建議。
當移植完成之后,我們會提供一個性能分析的工具,去幫助用戶去check這個軟件是不是能夠達到工作這樣一個標準,也就是說check它的性能指標,我們會去進行系統(tǒng)性的性能分析,也會去做軟件級的熱點定位分析。然后在此基礎(chǔ)上我們會給用戶提供一些華為所積累下來的認為比較有效的一些軟件優(yōu)化的方法,做一些比如說終端版殼操作,甚至一些其他的軟件修改的這樣建議,這個就是我們今天要介紹的三款軟件,通過這三款軟件我們就能比較方便的或者比較高效率的完成C,C++代碼,從非鯤鵬平臺向鯤鵬平臺的這樣一個遷移值的過程。
在C,C++軟件移植的過程當中,我們要著重考慮三個方面的問題,第1個問題是軟件構(gòu)建文件的差異。這里面舉兩個例子,一種是咱們這個方案里面,我們可能在x86平臺上常看到一個叫-M64的這樣一個知道編譯選項的option,這個含義,實際上是說要把我這個軟件生成成為64位模式的。是分成64位模式的,我們編譯目標代碼的ABI。實際上在鯤鵬平臺上,我們可以用類似的,我們可以用-mabi=lp64去來替換,當然如果安全的情況下,加上-FPIC就生成一個flowting的address,來屏蔽一些底層的相關(guān)依賴性,這樣子就能達到一個編譯選項M64的一個替換。
還有一個就是對應(yīng)Arm指令集、SA的這樣一個替換,我們常用的可能會見到一些-march的這樣一個參數(shù),在x86的平臺上提供了多達二三十種架構(gòu)平臺,從intend到AMD的各種各樣的,Arm平臺來說,就相對簡單一點,我們只需要去選用我們鯤鵬平臺,你CPU所支持的兼容Arm的架構(gòu)。我們鯤鵬920,我們進入的是AArm8.2-a這樣一個架構(gòu)。如果這些版本比較新,比如說9.1以上的,我們就可以去選用-mtune=tsv110。這實際上是我們泰山微內(nèi)核110這個型號這里面會在Gcc內(nèi)部進行了我們提了一些措施,針對架構(gòu)做的一些的public的tune優(yōu)化,能夠提供一個相對較好的性能。 性能增加,據(jù)說有5%~10%的性能提升。
接下來第二部分就是C,C++原碼的移植,這里面也舉兩個例子,第1個例子是這個是基本數(shù)據(jù)類型,盡管說我們鯤鵬平臺支持的是LP64,然后這個x86平臺也支持LP64的這樣一個規(guī)范,但是實際上大家在某些細節(jié)定義上還是有區(qū)別的,雖然字符寬度,比如說對x來講都是8字節(jié),但是x86他這個x是有符號類型的,但是對于我們鯤鵬平臺,我們用是無符號類型的,但這塊的改動我們就可以通過修改makefile里面,加一個參數(shù),加上-makefilex,去把默認的無符號的x定義成有符號的x,這樣就能保證C代碼邏輯,關(guān)于x操作上不會引入歧義。
第2類問題就是我們編譯器當中提供了多達數(shù)百個的這個宏定義,可以被我們C,C++軟件識取,比如說我們用GC的話,我們可以在C,C++的軟件里面,原文件里面直接去使用相應(yīng)的宏定義,這個宏定義在編譯的時候可能會我們的編譯器直接做環(huán)境變量的check,然后直接設(shè)置了相應(yīng)的正確的值,跟host環(huán)境相關(guān)的。我這里指編譯和運行在同一款機器上,我們不講host和target相異的情況。這個時候?qū)τ谙鄳?yīng)的軟件,我們就可能需要區(qū)分一下宏定義,比如說像這里x86 64,顯然一看就知道他是支持x86的,不可能在我們鯤鵬平臺上運行,這時候我們就會建議用戶去修改用戶代碼,用預(yù)編譯的方式做軟件范圍的定義隔離,很顯然對于我們鯤鵬平臺,我們常用的關(guān)鍵字就是aarch64或者是Arm64,這樣的關(guān)鍵字去做軟件邏輯的定義,除了這些以外,包括BBC都有各自的架構(gòu)定義關(guān)鍵字。
第3類問題就是我們匯編代碼的移植,這也是最頭疼的一塊,因為x86平臺如果細算的話,他將有2100個不到的匯編指令,鯤鵬平臺因為兼容Arm64,我們有1000出頭,1100不到,這樣一個匯編指令,其實這加起來3000多條指令,如果大家想把它分清楚,那是非常痛苦的。Int的相應(yīng)指令集的手冊有4000多頁,Arm相關(guān)指令集的手冊有7000多頁,純英文的文檔大家讀起來肯定會崩潰的,所以在這里面匯編代碼的移植,這是一個難點。
匯編代碼在我們的軟件過程中表現(xiàn)有若干種形式,第1種是我們純粹的就用Asm關(guān)鍵字去寫匯編代碼,第2種是我們用built in函數(shù)做一些替換,比如說這里舉個例子,像GCC里提供了built in的CRC的32計算的一些加速指令,我們可以去尋找鯤鵬平臺上的相應(yīng)的指令去進行替換,比如說像x86平臺上用到的預(yù)取的指令,我們也可以去找到鯤鵬平臺,上的built in函數(shù)去做替換。接下來還有第3種,就是我們可能會用到的Intrisic。Intrisic實際上是在jcc里提供的像C語言可以一樣去使用的匯編函數(shù),引出這個Intrisic是在x86平臺上和Arm64平臺,就相差非常的大。
在x86的平臺上Intrisic總數(shù)總數(shù)將近達到7000個,7000不到,然后在鯤鵬水平上相差就差的比較多,遠遠少于這個數(shù),為什么?這是因為在x86平臺上它支持的指令集比較多,他自己經(jīng)過二三十年的演進,對吧?他有mx的指令集,有SSE的指令集,還有AVX,AVX也分了128比特的,256以及500 12比特的三種。?每一種它對應(yīng)的Intrisic非常的多,所以移植的數(shù)量是非常大的。在這個里面我們可以找到一些,比如說對于一個28比特的操作進行一些對應(yīng),可以做一些替換。
針對上面提出的這些問題,比如說我們C,C++剛才提出這些問題,我們就提供了這樣幾個工具,我們這里提供了分析掃描工具,代碼遷移工具。分析掃描工具,就是識別我們軟件移植的依賴性,然后去幫助用戶做兼容性的排查。然后第2個提供代碼遷移的工具是做源碼的構(gòu)建工程工程構(gòu)建文件,還有C,C++原碼以及匯編代碼的掃描移植指導(dǎo)。第三個工具就是性能優(yōu)化工具,我們剛把軟件移植到鯤鵬平臺之后,我們需要去用這個工具去分析性能,去發(fā)現(xiàn)熱點,我們也提供了基于鯤鵬平臺的一個加速庫這么一個概念,一個組件。 這里面就提供了一個軟件硬件協(xié)同加速用戶應(yīng)用的一個方式。
比如說我們這里優(yōu)化了GDPC基礎(chǔ)運行環(huán)境,我們優(yōu)化的壓縮、加密、加解密,包括一些數(shù)學(xué)計算這樣一些開源的或者是三方的組建,我們優(yōu)化了一些IPP信號處理的一些程序功能提升,就是用我們軟硬結(jié)合的方式極大提升了性能。這里面我們大致分析的一個流程,我們會在分析掃描里面,我們把用戶的軟件上傳到我們的工具環(huán)境下,我們工具環(huán)境就會分析用戶X86平臺上軟件的安裝包,比如說這里的RPM包還有一些JAR、Java類的程序,包括一些壓縮包,我們就會去掃描識別里面軟件包內(nèi)部以及軟件安裝路徑內(nèi),包括我們壓縮包內(nèi)部的集成的,比如說這些SO件、二進制文件,去檢驗它是否在鯤鵬平臺上不同的操作系統(tǒng)上是否支持,去反饋用戶一個一致性的分析報告,會逐個告訴用戶SO是否兼容,不兼容的話怎么去處理?我們會提供鏈接是原碼的值,這個是源碼級的鏈接,或者是提供移植文檔方式書的這種鏈接,都會在我們報告里提供出來。
我們這個工具提供了兩種工作方式,一種是我們通過命令行的方式,下面這種形式通過參數(shù)輸入,一種是通過這種外部方式,我們在做了安裝包的依賴性分析以及原碼的掃描之后,會給用戶產(chǎn)生一個移植分析指導(dǎo)的報告,這個報告是提供CVS的格式或者是HDM的格式,用戶可以去下載,里面就會詳細羅列出哪些依賴庫,哪些二級制文件需要移植,然后哪些C,C++以及匯編代碼,需要移植規(guī)模有多大? 會給用戶呈現(xiàn)一個移植的工作量,比如以每月為單位提供一個工作量。
計算標準,用戶是可以自己輸入的,比如說你的編正能力強,你一個月C,C++代碼,你可以完成800行,匯編代碼你可以完成600行,對吧?如果你的移植能力有限,有的編碼能力有限,技術(shù)成本有限,你可以把它設(shè)置成比如說我C,C++代碼一個月300行,匯編代碼100行,它就會根據(jù)不同的標準,計算出你移植工作量,做工程技術(shù)上的第1步,第1部信息掌握。
這里就列出了我們主要的功能,前面我已經(jīng)基本贅述了,就是SO文件的檢查,構(gòu)建工程的檢查、源文件的檢查,評估一致性,然后進行工作量評估,兩種方式,外部方式和命令行方式。
通過這個工具,我們就可以拿到軟件移植的工程量的第1手資料,然后決定是否移植。當決定極值之后,我們就可以用代碼遷移工具去做進一步的分析,代碼移植工具主要是分析了用戶的源代碼,還是一樣,他著重分析的是makefile,C,C++的源碼,就包括我們這里的編譯器提供的宏定義,然后用戶自定義宏,還有built in函數(shù),Intrisic,還有匯編代碼,我們分析完這些內(nèi)容會提供一個詳盡的移植指導(dǎo),這里面就包含makefile怎么修改?C,C++代碼怎么修改? 然匯編代碼,我們怎么去修改?
這里我們只是給移植建議,我們并不去修改用戶的原碼,用戶可以參照著相應(yīng)的輸出我們這里輸出的一致報告,去用GTDF的方式,大家去做一個這個對比,然后去把它在工具界面以外用第三方的,比如說用其他的編輯工具把它完成修改。那么這一頁我們就列出了我們代碼移植工具的一個大致工作流程,同樣我們也是外部方式和命令行方式兩種方式,方便用戶做選擇。我們分析用戶的源碼構(gòu)建工程,還有公共建工程配置文件,還有C,CC+加的源碼或者是匯編源碼,然后給出移植知道,那么對于源碼的變化,我們會提供對比的方式顯示,像這里舉的例子就是左邊第1點是我們要改哪些文件,就是修改文件列表,第2類就是我們要原文件是什么樣子,第3類就是我們建議修改成什么樣子?
這是我們軟件移植工具所能提供的能力,我們C,C++,我們這里還是針對C,C++目前為止C,C++的這樣編譯型語言,去做了建議值,然后我們要有源碼,沒有源碼,也就談不上移植了。
好,這就到了我們抽獎的第2次抽獎環(huán)節(jié),我們稍事休息。
下面我們將畫面交給老師,繼續(xù)授課。
前面已經(jīng)講了,我們?nèi)绾稳プ鲕浖蕾囆缘姆治?,通過華為開發(fā)套件去做軟件依賴性的分析,以及做C,C++的移植,我們在完成移植之后,我們會在生產(chǎn)環(huán)境上去跑我們這個軟件,我們可能會去做性能分析,這時候我們就會提供一個我們叫做分析的一個工具,這個工具主要是幫助用戶去做軟件性能定位,比如說你有些性能瓶頸或者有想繼續(xù)優(yōu)化,我們這里提供了一些手段,這里對于這個工具我們可以幫助用戶去分析處理器相關(guān)指標,以及看到調(diào)度的一些信息,包括外設(shè)的信息,包括CPU、磁盤,甚至網(wǎng)卡、短期性的數(shù)據(jù),去幫助用戶分析C,C++或者是Java程序這樣一個性能指標。
我們Java類不是說把GBM當成一個進程,我們是看到GBM內(nèi)部的,還是有一定作用的,還是比較有用的。我們會把這些數(shù)據(jù)統(tǒng)統(tǒng)的分析起來,然后通過我們自己定的定義的數(shù)學(xué)模型進行分析,去看到用戶的軟件性能瓶頸,比如說是資源競爭的問題或者是調(diào)度的問題,甚至說比如說有一些bug導(dǎo)致了一些次循環(huán)等等的,我們提供了多種的方式來呈現(xiàn)這樣一個結(jié)果。比如說我們常用的這種火焰圖的方式,我們這里能夠提供比較直觀的可視化方式,幫助用戶去看自己的軟件里面到底有沒有性質(zhì)上的問題。
這個是我們這里是羅列一下我們目前性能分析工具能夠提供的性能指標,我們能夠看硬件器件相關(guān)的,比如CPU、內(nèi)存、磁盤、網(wǎng)卡、系統(tǒng)級的,我們也能看這種線系統(tǒng)調(diào)度以及的比如說進程、線程,還有彼此之間的切換,或者是資源的爭搶,鎖這樣的一些關(guān)鍵變量的這樣一些性能分析先行指標,我們也提供了一個基于火焰圖、基于代碼邏輯的深層次檢查,能夠提出用戶代碼的真正的開銷,大的地方在哪里,對應(yīng)的代碼對應(yīng)到源碼。
通過這樣一個手段,我們就能幫助客戶比較快的去幫助開發(fā)者比較快的定位自己的軟件,編譯形軟件的瓶頸。,當定位到軟件瓶頸的時候,我們會提供一些附加的能力,比如說這里我們就提供加一個叫加速庫,我們軟硬結(jié)合的加速庫幫助用戶去優(yōu)化代碼。這個原因是什么?這原因主要是因為我們鯤鵬是一個sock,我們是一個片量系統(tǒng)。
除了泰山內(nèi)核,以及多達48甚至64的內(nèi)核以外,我們還提供了一些額外的能力,額外的一些引擎,這些加速引擎就可以支持,比如說壓縮LZ77的這種算法,還有加解密的,比如說非對稱的,還有對稱加密的,包括一些常用的變加解密的這樣算法,比如說DH編碼等等。
我們還支持了比如說存儲用到code等一些這樣一些常用的軟件算法,我們把它運化成加速器,這種壓縮用起來非常簡單,就跟我們用一個外設(shè)一樣,我們只需要從華為的網(wǎng)站上去獲取相應(yīng)的硬件驅(qū)動代碼,把它安裝上之后,我們就可以像一個正常的外設(shè)一樣去使用它。
當然了你要使用我們提供的一些API的話,可能還要遵循一些,比如說我們要提供給用戶手冊,用戶可能要去修改一下自己的源碼,比如說可能原來掉的一些是軟件的這樣一些函數(shù),或者是三方組建的API,這時候可能去要用加速器的話,就需要根據(jù)API修改我相應(yīng)的這個代碼邏輯,但這個代碼邏輯只是存在于API層面。
這里舉個例子,比如說我們這里集成了一個叫RC的加速的引擎,是用來計算finish加密的,我們支持1024~4096,4種:1024?2048?3072?3096,4種密鑰長度。我們在我們加速器引擎里面,我們是通過一個用戶態(tài)的來libry去做一個隔離,對上去隔離用戶的,比如說開源的第三方軟件,比如說這里貼到open SSL的的API,我們?nèi)觨pen SSAPI我們也可以把API暴露出來,直接給用戶的APP去使用,在libry下層的就是我們IC引擎的相應(yīng)的驅(qū)動,用戶可以完全不用知道下面細節(jié)是如何實現(xiàn)的,但是我們通過只要使用我們正確調(diào)用鯤鵬RC的提供的用戶libry,就可以去使用我們加速器的硬件計算能力,極大的加快了RC的計算。
其實我們也知道RC計算如果用CPU算的話,那是相當費時費力的。比如說一個像x86的一個中高端的一個call,可能它每秒鐘只能執(zhí)行720次左右的一個RC2048的計算。但是你要用到了鯤鵬920提供的RC計算引擎的話,計算量將是大幅度的提升,也就是說,我可以把原本用來計算RC的這些CPU完全釋放出來,跑我的業(yè)務(wù)!在一個芯片內(nèi)完成這樣業(yè)務(wù),就會對用戶來講就會提供另外一個選擇,我不需要去買某些PCIE的插卡,我直接去用軟件的方式來提升我的軟件性能,達到一個比較簡單的提升性能的一個方式。 這是我們舉的一個例子,在這些里面,在我們移植工具里面,都會去通過我們軟件移植的這樣一些能力去提供給開發(fā)者直接使用。
這個是我們幾個工具組建的發(fā)布的策略,我們目前為止是停留在中間這一列上,我們完成了多OS的適配,比如說我們支持3~4、74、7.5、7.6、7.7、7.8對吧?我們也支持中標麒麟等,我們也支持了像蘇C這樣一些的操作系統(tǒng),就是我們盡可能的去幫盡可能覆蓋我們常用的這樣一些操作系統(tǒng)的類型,我們也支持了GCC的多個版本,我們從4.8.9一直支持到目前為止至少8.3,我們后續(xù)會支持到9點幾的版本,一直往上支持上去,幫助客戶去盡可能的簡化一些重復(fù)勞動,我們也支持MAC構(gòu)建工具,也要支持CVK構(gòu)建工具,未來還會支持automake這樣的一個構(gòu)建工具的一些檢查。
支持C,C++的與代碼移植,也支持匯編代碼的識別,因為剛才前面說了,從匯編指令的角度來講,從你Intrisic的數(shù)量來講,這個量非常的大,而且也很有技術(shù)挑戰(zhàn)的,就是匯編語言的替換,所以這塊我們會逐步完善。對于加速這一塊,我們是提供一些Intrisic的一些替換,比如說我們有abs或者有SSE。
我們也去優(yōu)化了,像一些常用的加速的三方的組件,比如說像一些z-lib的加速或者stapi的一些加速,還有一些scan這種字符掃描的加速的,我們用鯤鵬的指令去進行優(yōu)化,進行性能提升,取得了比較可觀的一個性能改變都是50%,一倍,甚至更多的3,4倍的這樣一個性能提升,所以加速的效果還是挺明顯的。這樣也能讓用戶的軟件應(yīng)用跑在空間當中跑的更快又快又好。
如何去獲取我們這幾個工具,我們可以通過華為的spot網(wǎng)站去下載,也可以通過華為空方社區(qū)去下載相應(yīng)的軟件,這上面提供了一些鏈接。
對于我們加速庫軟件,這里的策略是主要采取開源的這種策略,比如說像JDPC或者一些三方組建的,包括一些壓縮算法,壓縮引擎的,包括這些軟件組件,我們都是把相應(yīng)的patch去推動到社區(qū)里面去。對于硬件加速引擎,我們也是直接可以從華為的鯤鵬社區(qū)上去下載,然后去安裝使用,取用起來還是比較方便的。
鯤鵬社區(qū)以后就是華為重點建設(shè)的一個和開發(fā)者溝通的互動的地方橋梁。在這個地社區(qū)里,我們就可以下載到數(shù)百份的軟件移植指導(dǎo)以及相應(yīng)的軟件調(diào)優(yōu)的經(jīng)驗,可以在這里面和其他的開發(fā)者做互動,做技術(shù)上進一步的探討。 然后很多新的技術(shù)資料、技術(shù)文檔,包括一些白皮書,一些產(chǎn)品設(shè)計方案都會在社區(qū)里陸續(xù)發(fā)布,不同的開發(fā)者都能得到一些不同的信息。
這里列出來,我們空開發(fā)者社區(qū)里面如何去得到兩工具這幾個工具,目前我們這些工具都已經(jīng)上線了,9月30號是第1版本,9月30號以后我們是每月逐月發(fā)布的這樣一個節(jié)奏,這個節(jié)奏將延續(xù)到2020年,就是說我們不是一個短期行為,我們會一直從開發(fā)者的需求角度來出發(fā),去把這個工具做的更加應(yīng)用,更加方便幫助用戶完成C,C++加代碼的90%的工具化移植。
其實在鯤鵬的開發(fā)的平臺里面,因為鯤鵬是空中平臺,是一個新生事物,對吧?對于x86而言是一個新生事物,在這個里面我們也能感受到,隨著鯤鵬計算平臺的壯大,應(yīng)用越來越多,需要大量的開發(fā)者去投入到平臺的生態(tài)建設(shè)里面來。所以華為在這里推出了這種線上認證培訓(xùn)的這么一系列的技能提升的活動,包括在線課程,包括云端的實驗室,包括線上認證和線下培訓(xùn),希望大家能夠積極參與,來共同構(gòu)建華為鯤鵬的生態(tài)軟件生態(tài)。
這里提到一個華為鯤鵬認證開發(fā)工程師這么一件事情,就是HCIA認證認證其實在華為內(nèi)部還在對華為來講還是蠻有價值的,對開發(fā)者來講也是很有價值的。因為你通過了認證之后,在一定程度上將會成為你進入華為從事軟件開發(fā)的一個直通車。
所以大家可以關(guān)注一下相關(guān)的一些培訓(xùn)認證的信息,去找到一個適合自己的方向,然后去在一個更大的舞臺上,我們一起來構(gòu)建華為鯤鵬的軟件生態(tài)環(huán)境,讓華為鯤鵬做得越來越好。
現(xiàn)在線上提供了華為文檔中冊這么一個活動,希望開發(fā)者通過掃描二維碼來參與到我們?nèi)A為空投文檔的這一個測試活動,因為華為文檔、鯤鵬文檔實際上是我們近幾年來在鯤鵬平臺上的軟件移植、調(diào)優(yōu),包括軟件優(yōu)化,包括軟件開發(fā)的一系列經(jīng)驗總結(jié)。
這里面文檔非常多,大家可以去找自己感興趣的去無論是學(xué)習(xí)也好,還是去交流也好,大家可以在鯤鵬的開發(fā)者社區(qū)上去留言互動,我們會有相應(yīng)的開發(fā)工程師及時來和大家來響應(yīng)。
好,這就到最后一個提問互動環(huán)節(jié)了。線上的開發(fā)者有什么問題嗎?我們可以交流一下。
主持人:剛才老師在講的過程中,我們也在線下將這些問題進行了梳理,現(xiàn)目前老師就進行一個答疑的環(huán)節(jié),老師我把問題給到您,您可以看一下。
老師:第1個問題是王涵,他這個問題是軟件移植是基于同樣的操作系統(tǒng)移植嗎?我們的軟件系統(tǒng)不是一個可以是相應(yīng)平臺,也就是說我們軟件可以跑在其他軟件上,但是我最終的軟件移植可能是移植在一個烏幫圖上,甚至說一個中標70上。這時候就是我們支持一個相應(yīng)軟件的移植,其實對我們來講,重點要關(guān)注的就是你的軟件運行依賴庫或者是安裝依賴庫的一個兼容性問題,就是我們后面一個花了巨大人力去積累的一個清單,兼容性清單。從技術(shù)角度來講,在非常大的程度上去滿足這種建設(shè)性清查。
第2個問題,從x86移植到鯤鵬,會不會導(dǎo)致性能急劇下降?要看應(yīng)用的類型。就說如果你是一個純粹的C,C++做一些通用計算的話,我能說是不會,但是如果說你C,C++里面非常高級的,你用了一些底層的匯編,如果用到了一些x86所獨有的,比如說AVX4做一些向量化計算,或者是做一些這種高并發(fā)的計算,我不得不坦率的告訴你,性能軟件,因為AVX指令或者是不管無論是256比特大概是512比特,在鯤鵬920平臺上現(xiàn)在是沒有對應(yīng),但是以后會有對應(yīng)。
這個以后我目前我也不能說是什么時候對吧?但是這是一個長期的演進的計劃和過程,所以這個說我只能先告訴你,如果你要用到這些AVX指令,我們是有性能差異的。坦白的來講,對吧?有一說一。
然后還有一個問題,鯤鵬與手機處理器都是基于驚險指令集,能否認為可將手機一起底層的功能移植到鯤鵬平臺上?這個是我們現(xiàn)在可能常說的所謂的叫端邊云融合,實際上做手機端開發(fā),我們可能更多的是基于安卓的系統(tǒng),然后做一些用一些Java類的語言,然后我們的應(yīng)用可能是編譯成字節(jié)碼跑的GVM上,對吧?
從這個角度來講,如果說你單純從語言,我可能說差異并不大,你可能在鯤鵬平臺上你可以方便的裝一個安卓模擬器,對吧?通過這種方式,我們?nèi)A為鯤鵬也提供這樣這樣一個解決方案,讓你可以跑一個云手機,在官方平臺上看云手機,跑得非常的高效,非常的高效,這個也能滿足,所以從這個角度來講,我們提供了一套解決方案,是沒有任何沒有任何問題。
第三個問題,Java代碼如何移植?這個問題在前面的膠片上我們已經(jīng)看了,因為Java屬于這種字節(jié)碼運行的,于強依賴于他的roundtime環(huán)境,在我們?nèi)A為鯤鵬平臺上,我們是完美支持open jdk的,所以你用open jd1.8或1.9甚至更高的版本,這個是從Java,代碼語言本身來講是沒有問題的。
但是如果說你Java里面非常高級的,你又嵌套了一些C的一些API,請把C單獨的源碼拿出來做一些一致性的檢查。
第四個問題,目前提供什么移植工具?Java剛才說的,我們在這個工具里面不去做涵蓋檢查,除非你Java,或者是像類似于這種Python,你用到了一些C編譯成的SO文件用到一些C提供的API,我們是要檢查。
最后一個問題,還有10%的代碼可以如何遷移?但是這個問題問得很好,我們剛才前面其實我已經(jīng)提到了,因為指令集的差異,對吧?包括C里面的編譯器里面提供了一些built in對應(yīng)函數(shù)的一些差異,可能有些built in如果大家去細細看的話,看C++的源碼的話,你會發(fā)現(xiàn)有些標的函數(shù)用的是AVX的指令,甚至是SSE的一些指令,這些指令可能在鯤鵬平臺上目前并不支持,所以從這種角度來講,我們沒辦法給你做到這種100%的對應(yīng)。
但這個就是我們所提到的一個缺陷,因為從我們?nèi)A為軟件移植的既往經(jīng)驗來講,可能真正的匯編代碼在一個大的工程里面,可能它所占的比例是比較有限的,而這部分的代碼里面又用到了AVX,甚至于說和華為共同完全不兼容的,這樣功能性上不兼容的指令是又更加少一些,所以這就是我們所說的,我并不能保證100%去支持這樣一個軟件的移植,所以我們也在不斷的演進,謝謝!
主持人:希望大家多多關(guān)注我們的鯤鵬社區(qū),今天老師主講的內(nèi)容我們已經(jīng)上傳到了鯤鵬社區(qū),大家可以對資料進行一個下載,再進行一些學(xué)習(xí)都可以的,因為鯤鵬社區(qū),它匯聚了我們鯤鵬的最新的一些知識問答,也匯聚了一批我們行業(yè)的專家,大家有什么問題的話都可以在鯤鵬社區(qū)上進行一個留言,我們的專家會進行一個及時的回復(fù),相關(guān)的技術(shù)包、安裝包以及相關(guān)的一些學(xué)習(xí)資料上面也比較齊全,如果關(guān)注鯤鵬的話,可以到上面去進行一個獲取。
再次恭喜我們剛才的提名提問的這三位用戶,這三位用戶恭喜你們獲可以獲得我們50月50元的京東卡給到你!還請加一下華為云專家小助手的微信公眾微信號反饋你們的姓名,電話、地址,工作人員進行一個核實后,會把禮品對應(yīng)的禮品發(fā)放發(fā)送給您,因為時間關(guān)系,我們今天的直播也到此結(jié)束,感謝我們的老師為我們進行本次的授課,謝謝老師,謝謝各位。
謝謝在線的觀眾,謝謝寶寶們。
軟件開發(fā)
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔相應(yīng)法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔相應(yīng)法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。