乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      為什么必須將代碼從x86遷移到ARM,這篇文章給你答案

       西北望msm66g9f 2020-06-13

      “我們非常希望 ARM 和鯤鵬的生態(tài)能成為下一個計算產(chǎn)業(yè)迭代的方向?!痹?6 月 8 日于成都舉辦的華為 DevRun 開發(fā)者沙龍——四川鯤鵬開發(fā)者嘉年華上,華為鯤鵬計算產(chǎn)業(yè)開源與生態(tài)營銷總監(jiān)梁冰對計算產(chǎn)業(yè)未來展望道。

      新基建風(fēng)口下,算力一躍成為了新的生產(chǎn)力,云、AI 與 5G 則是新的生產(chǎn)工具,技術(shù)聚變將引發(fā)商業(yè)裂變,帶動各行各業(yè)的數(shù)字化快速發(fā)展?;?5G 等新興技術(shù)的創(chuàng)新應(yīng)用催生多樣化算力的需求,市場既需要通用計算算力也需要異構(gòu)計算算力。此外,摩爾定律的逐漸放緩,讓算力和性能陷入一系列發(fā)展瓶頸,市場對創(chuàng)新架構(gòu)的需求日益加深,計算平臺的創(chuàng)新之戰(zhàn)一觸即發(fā)。

      在此背景下,x86 架構(gòu)的不足越發(fā)明顯,功耗大、通用寄存器數(shù)量少、計算機硬件利用率低、尋址范圍小等問題凸顯,難以跟上算力發(fā)展的速度。與此同時,ARM 架構(gòu)在移動互聯(lián)網(wǎng)盛行的當(dāng)下卻開始煥發(fā)出別樣的生命力。

      “基于 ARM 架構(gòu)來設(shè)計的鯤鵬,其成功的前提是早早地便看到了未來計算機算力架構(gòu)的迭代之路。對華為來說,不光要在中國攜手合作伙伴共建鯤鵬生態(tài),為更多企業(yè)帶來價值,更為重要的是要融入全球 ARM 的生態(tài),共同推進 ARM 進階為下一代計算機平臺的事實標(biāo)準(zhǔn)?!绷罕鶎H鵬生態(tài)的意義闡述道。

      從 x86 遷移到 ARM 架構(gòu)的過程并不簡單,本次活動中,華為鯤鵬計算專家對于鯤鵬軟件遷移路徑也進行了非常全面細致的講解,同時針對軟件遷移過程中可能遇到的問題及解決方案也進行了相關(guān)講解,還為現(xiàn)場開發(fā)者設(shè)置了實操演練環(huán)節(jié),一對一指導(dǎo)下進行鯤鵬軟件遷移線上實驗。

      從 x86 向鯤鵬遷移的必要性

      眾所周知,計算機是由軟件和硬件組成的,上層的軟件是通過指令集驅(qū)動下層的硬件,軟件想要跑在 CPU 上的話,那它必須要有對應(yīng)的指令集。

      如上圖所示,整個計算機的計算基礎(chǔ)架構(gòu),從底層的晶體管、物理原材料,二極管也就是邏輯門電路,到往上走的微架構(gòu)、自評級架構(gòu),再往上面走就到了操作系統(tǒng)所完成的二進制機器譯碼匯編高級語言、JavaC 等等,整個技術(shù)站從復(fù)雜到抽象,技術(shù)語言也從經(jīng)歷一個簡單的交換指令發(fā)展為匯編進行訪存和鎖存,再到形成機器碼,這個過程中最核心的變化在指令集上。

      想要成功運行,底層計算平臺就必須能夠支持該 CPU 的指令才可以,這也是在 x86 和鯤鵬編譯的不同之處。

      如上圖所示,x86 和鯤鵬使用的指令是不一樣的,簡單來講,在鯤鵬上使用的是精簡指令集,而在 x86 上使用的是一個復(fù)雜的指令集。綜合來講,它有三點主要的差異:

      • 架構(gòu)差異:x86 和鯤鵬處理器 (aarch64) 屬于不同的架構(gòu)。

      • 指令集差異:x86-- 復(fù)雜指令集,鯤鵬處理器 -- 精簡指令集。

      • 向量寄存器差異:x86 和鯤鵬處理器使用向量寄存器不同,向量指令集也存在差異。

      從這三點出發(fā),一個在 x86 上運行的程序根本不可能毫無阻礙地就可以在鯤鵬上使用,必須經(jīng)過編譯,同時也證明了遷移的必要性。

      遷移的五個步驟

      1. 遷移準(zhǔn)備:信息收集 & 環(huán)境申請

      信息的收集主要分為兩部分,首先是硬件信息的收集,主要就是一些型號,目的是根據(jù)此類信息匹配一個 x86 的服務(wù)器;其次是收集軟件棧信息,包括操作系統(tǒng)、虛擬機、中間件、編譯器、上層依賴的開源軟件、商業(yè)軟件、業(yè)務(wù)軟件等信息。

      2. 遷移分析:軟件棧分析 & 編程語言分析

      這一過程要做的就是對收集到的信息和軟件棧做初步分析,目的是判斷是否真正需要遷移,評估遷移的工作量。

      對開源軟件來說,因為社區(qū)發(fā)展已經(jīng)比較成熟,遷移相對較為簡單,通過基于鯤鵬的架構(gòu)分支或者鯤鵬支持的軟件包,自行安裝即可。對于自研軟件來講,情況則較為復(fù)雜,如 C、C++ 這類編譯型軟件,從指令集差異化出發(fā),需要重新編譯后才能完成遷移,而 Java、Python 這種解釋型的語言,因為其虛擬機如 JDK、PVM 已經(jīng)把上層的一些跟指令集相關(guān)的東西屏蔽掉了,平滑地遷移過去即可。對于商用軟件而言,不會公開源碼,如果需要遷移,就必須要聯(lián)系廠家去編譯一個鯤鵬的版本,并且完成一系列的適配。

      此外像運行環(huán)境、虛擬機、編譯器和操作系統(tǒng)這些也是要進行替換,但是這些并非需要重新編譯,因為在華為云鯤鵬論壇內(nèi)有軟件倉庫,可以直接去軟件倉庫下載由鯤鵬官方所做的經(jīng)過驗證的版本。

      3. 編譯遷移:代碼遷移 & 軟件包遷移

      編譯型的語言,之所以遷移起來比較困難,原因就在于涉及到比較多的遷移點,下面將從代碼和軟件包兩方面進行闡述。

      對于對指令集有依賴的代碼來說,與 x86 架構(gòu)相關(guān)的,都需要替換成 ARM 架構(gòu)下的語言;像以 Java、Python 為代表的解釋型語言,換一下 JDK 和 PVM 就行了,如果語言中調(diào)用了編譯型語言,必須把這部分重新編譯才可行。對于軟件包來說,其遷移與 Java、Python 語言類似,即掃描出來里邊的對編譯型語言的依賴,把這一部分依賴進行替換即可。

      4. 性能調(diào)優(yōu):性能指標(biāo)測試 & 性能優(yōu)化

      經(jīng)過前面幾個步驟之后,軟件遷移其實就基本完成了,之后要對性能進行調(diào)優(yōu),主要分為建立基準(zhǔn) 、壓力測試 、確定瓶頸、 實施優(yōu)化、 確認效果五個步驟。

      首先需要建立調(diào)優(yōu)基準(zhǔn),該基準(zhǔn)根據(jù)當(dāng)前的硬件配置、組網(wǎng)、測試模型來做綜合評估,以建立合理的條有目標(biāo);其次在調(diào)優(yōu)目標(biāo)建立后,通過壓測工具對軟件或系統(tǒng)進行加壓,在加壓過程中暴露性能瓶頸,確定瓶頸之后對瓶頸進行優(yōu)化;第四,注意在優(yōu)化過程中要及時記錄,因為優(yōu)化并不一定是正向的,出現(xiàn)負向優(yōu)化時需要及時回退;最后在優(yōu)化措施實施完成后,需要重新啟動壓力測試工具以確認優(yōu)化效果。

      5. 測試與認證:壓力測試 & 長穩(wěn)測試 & 規(guī)模商用

      調(diào)優(yōu)結(jié)束之后,接下來就要把功能運力、長穩(wěn)運力以及性能運力都跑一遍,達到一個商用的標(biāo)準(zhǔn),就可以籌備上線了。此外也可以將軟件和系統(tǒng)進行鯤鵬展翅認證,其可以擴展應(yīng)用的軟件使用空間并能夠加入鯤鵬生態(tài)。

      不同語言的遷移注意事項

      實際上,像 Java、Python、Perl 這種跨平臺的開發(fā)語言,它的遷移的技術(shù)難度相對來說是比較低的,主要是因為 Java 有一個 JBM,Python 中存在一個解釋器,它們屏蔽了大部分的平臺架構(gòu)上的差異。與之相反,C 和 C++ 的難度相對來說要高一些,原因是如內(nèi)斂函數(shù)還有 x86 加速的一些指令,無法支持像微軟這種閉源的開發(fā)架構(gòu)。

      典型的如 C/C++/Go 語言,都屬于編譯型語言。編譯型語言開發(fā)的程序在從 x86 處理器遷移到鯤鵬處理器時,必須經(jīng)過重新編譯才能運行。如下圖所示,源碼需要由編譯器、匯編器翻譯成機器指令,再通過鏈接器鏈接庫函數(shù)才能生成機器語言程序。

      接下來就是 C/C++ 代碼的編譯構(gòu)建了,這個過程一共分為六步:

      • 獲取源碼:通過 github 或第三方開源社區(qū)獲取

      • 準(zhǔn)備編譯環(huán)境:安裝編譯器 gcc 等

      • 使用源碼中的 CMakeLists.txt 或 configure 腳本生成 makefile

      • 執(zhí)行 makefile 編譯可執(zhí)行程序

      • 替換依賴庫:重編譯或替換依賴 x86 平臺的 so 庫

      • 將可執(zhí)行程序安裝部署到生產(chǎn)或測試系統(tǒng)

      既然是最為復(fù)雜的,C/C++ 語言的遷移問題也是涉獵最廣泛的,主要涉及到七類問題:

      • 編譯腳本和編譯選項的移植:以 x86 下 -m64 代碼為例,其主要功能是將應(yīng)用程序編譯為 64 位,對應(yīng)到鯤鵬上是用 -mabi=lp64 的編譯選項,此類編譯選項需要在腳本中修改;此外, x86 平臺上默認的 char 類型是一種有符號的類型,對應(yīng)到鯤鵬上則是無符號類型,在移植過程中需要顯示定義并將 char 類型定義為有符號,方法一是在源代碼里加上 signed char,方法二是直接用 fsigned-char 來修改。

      • 編譯宏的移植:編譯宏的作用就是讓編譯器知道編譯哪些分支代碼能夠在不同架構(gòu)下達到最優(yōu)性能。如何對編譯宏下面的代碼實現(xiàn)移植?86 代碼上有些編譯器自帶自定義宏,比如 smd 屬性相關(guān)的宏在 x86 上是 SSE 開頭的宏,對應(yīng)到鯤鵬平臺上就需要自定義它的編譯宏和所相對應(yīng)的分支。

      • Builtin 函數(shù)移植:Builtin 函數(shù)是編譯器自帶的函數(shù),其在實際遷移項目中相當(dāng)常見,主要是 crc32 校驗值的計算。需要移植的普通 builtin 函數(shù)實際并不多,大部分需移植的 builtin 函數(shù)集中在 SSE intrinsic 函數(shù)內(nèi)。

      • 內(nèi)聯(lián)匯編函數(shù)的移植:第一種是指令替換,x86 上對應(yīng)的是 bswap 指令,鯤鵬對應(yīng)的是 rev 指令,其它有些操作和寄存器都是基于內(nèi)聯(lián)匯編的語法規(guī)則進行替換的。第二種是 Builtin 函數(shù)的替換,以 x86 的指令 popcnt 為例,比如 popcount 是對二進制數(shù)里面的 1 進行計數(shù),對應(yīng)到鯤鵬平臺上所替換的是 popcountll。

      • SSE intrinsic 函數(shù)移植(SIMD 技術(shù)):Intel 的 SIMD 擴展指令統(tǒng)稱 SSE,主要分為三類,MMX 是 64 位寄存器,SSE 到 SSE4 是 28 位的,三是 AVX256 和 AVX512。鯤鵬基于 SIMD 的技術(shù)發(fā)展比較成熟,現(xiàn)在有些基于開源量的 NEON 庫主要是在圖象處理和視頻處理層面。

      • SSE intrinsic 函數(shù)移植(MMX/SSE):針對 MMX 指令,x86 上用的是 -m64 的向量做加法運算,對應(yīng)到鯤鵬上是 int32×2 然后再做加法運算,類似于常用的 C 函數(shù)規(guī)則;針對 SSE 指令,從內(nèi)存中加載 4 個單精度浮點數(shù)據(jù)到寄存器,x86 是 load,對應(yīng)到鯤鵬用的是 vld1q。

      • SSE intrinsic 函數(shù)移植(AVX):以 AVX 指令使用了 256 位寄存器運算為例,向量 A 和向量 B 中分別存儲了 8 個單 精度浮點型 (32 位),對應(yīng)到鯤鵬處理器上,使用 128 位寄存器實現(xiàn) SIMD(Single Instruction Multi Data) 進行計算。

      盡管解釋性語言難度降低,但 Java、Python 代碼遷移過程中同樣有一些問題需要注意。

      如上圖所示,Java 想要進行遷移的話,首先需要安裝運行環(huán)境 JDK,Java 源碼通過 Java 編譯器之后就會生成一個 Java 的字節(jié)碼,這時候可能 jar 包會有一些 SO 庫的依賴,那就需要鏈接進行打包。

      這整個的過程,存在遷移修改點的地方有二,一是 JDK 的安裝,遷移過來推薦使用華為的 JDK 或者 OpenJDK;二是對 SO 庫這個二進制庫的依賴,如果你是在 x86 下編譯的,毫無疑問,這在鯤鵬下面是沒辦法進行運行的,所以你需要拿到相應(yīng)的源碼或者找到 aarch64 的 SO 庫來進行替換,最后進行重新打包。

      再來看 Python 源碼的遷移,其實與 Java 很類似,也是需要從編譯環(huán)境和 SO 庫兩大方面入手修改。環(huán)境上推薦使用 A32,Python3 你也可以通過樣本安裝,也可以通過源碼安裝;SO 庫有多種類型,但對于各種方式的 SO 庫,最后都是對應(yīng)為一個 SO,定義為 SO 庫,需要的步驟也都是一致的,即裝配環(huán)境、重新編譯、重新替換。

      不同的地方只是前面安裝的是 Python 的運行環(huán)境。Python 源碼同樣通過解釋器生成一個字節(jié)碼,這時候可能我們會依賴外部的一些 Python import 模塊進來,這些模塊里面可能有一些 SO 庫,Python 解釋器的解釋執(zhí)行后就是部署運行了。

      相對于 C++ 來說,Java/Python 的遷移點并不是太多,總結(jié)下來,主要需要注意兩點:

      • 編譯器包括解釋器的安裝、遷移,這里有兩種方式,方式一是通過 YAM 源的方式進行安裝,方式二是找到源碼進行編譯重新安裝。

      • x86 依賴 SO 庫的情況下,需要找到 SO 庫相應(yīng)的源碼,進行重新編譯后實現(xiàn)替換。

      寫在最后

      “拿華為的話說,就是自己的降落傘自己先跳。長虹大數(shù)據(jù)平臺的規(guī)模比較大,有一百多個服務(wù)器,原來是一個 PB 級的數(shù)據(jù)存儲,涉及到的整個生態(tài)組件有 20 多個,我們將原來存在的 1700 多萬的終端業(yè)務(wù)遷移到基于鯤鵬的大數(shù)據(jù)計算平臺,耗時近 5 個月。鯤鵬的架構(gòu)在 HBS 場景下優(yōu)勢凸出,另外在存儲、IO 等方面基本上是持平,總體來說,鯤鵬的芯片表現(xiàn)性能都還不錯。”長虹計算產(chǎn)業(yè)事業(yè)部技術(shù)總監(jiān)蒲文龍這樣評價到同行者華為鯤鵬。

      無獨有偶,麒麟軟件有限公司技術(shù)總監(jiān)李洋同樣贊揚道,“華為鯤鵬的代碼遷移工具,包括分析掃描工具、代碼遷移工具及性能優(yōu)化工具,這是作為開發(fā)者一定要去了解的非常方便的工具,它可以讓開發(fā)者快速地分析系統(tǒng)軟件源代碼,以及對所需要的依賴包進行編譯和重構(gòu)?!?/p>

      對于開發(fā)者來說,遷移是一套必須掌握的技能;對于互聯(lián)網(wǎng)企業(yè)來說,遷移是助力企業(yè)抓住未來趨勢的一個必要動作。從 x86 架構(gòu)到 ARM 架構(gòu),計算產(chǎn)業(yè)的未來已經(jīng)漸漸明晰,而鯤鵬作為先行者,生態(tài)的力量也愈發(fā)強大,始終秉持著“硬件開放、軟件開源、使能伙伴”的初心,逐漸發(fā)展成為滋養(yǎng)新計算產(chǎn)業(yè)的一方沃土。


        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多