算力爲王的時代,這項技能你還沒有掌握嗎?

據 IDC 預測,到 2023 年全球計算產業生態體系將發展爲近兩萬億美元的市場,中國則將超過 1.1 萬億人民幣,數字經濟產值將佔到全球 GDP 的 62%。全球進入數字經濟時代,數字化浪潮已經是全球大勢所趨。

在宏觀政策和科技進步的雙重驅動下,數字經濟迅猛發展,當前已經發展到以人工智能、雲計算、大數據爲核心支撐力的時代,計算產業的窗口大開,多樣的場景和爆發式增長的數據也激發了大量的計算需求。

在這樣的背景下,計算產業的發展勢在必行。秉持着“硬件開放、軟件開源、使能夥伴”的初心,華爲鯤鵬以技術創新爲動力、以技術佈道爲使命,致力於推動計算產業的發展。在 18城鯤鵬創新中心開發者創享日——鯤鵬開發者嘉年華西安站,來自華爲鯤鵬的技術專家爲大家分享瞭如何從 x86 遷移到 ARM,並結合遷移案例讓大家更好地理解。

爲什麼要做軟件遷移

一般來說,計算框架是從下到上,從硬件到軟件,傳遞的是軟件的信息模擬和處理。最底層的基礎物理原材料、晶體管、寄存器、微架構等都屬於硬件層面。而軟件層面則特指由高級語言、彙編語言開發的應用程序。要執行軟件層的應用程序,就需要將高級的編程語言編譯成機器語言,這個過程是通過一個個指令完成的。

不同的處理器架構指令集不一樣,指令的長度也不一樣,比如 x86 上 mov 指令一般是 16-24位,在鯤鵬上則都是 32 位。

因爲以上這些差異,在 x86 上編譯出來的程序無法直接在鯤鵬上運行,所以纔有了從 x86 到鯤鵬的遷移必要。

從 x86 到鯤鵬,5 個步驟完成軟件遷移

從 x86 到鯤鵬整個軟件遷移過程主要分爲以下 5 個步驟:

遷移準備

收集硬軟件信息。包括芯片類型、存儲等硬件設備信息和中間件,開源軟件,商業軟件,包括自己的自研軟件等軟件信息。
準備遷移環境。做環境申請,可以在華爲的 Openlab 網上申請,做一些軟件的初步認證。

遷移分析

這一步要做的是分析前一步收集到的信息,判斷是否真正需要遷移,評估遷移的工作量。針對主要的業務軟件:
開源軟件總的策略就是把原網的代碼下載下來,做編譯。
自研軟件:有的 C/C++/Go 類編譯語言需要做重新編譯,Java/Python 等解釋型語言需替換 ARM 版本 JDK或 PVM 虛擬機。
商用軟件:可以通過聯繫廠商獲取它對應 ARM 架構下的軟件版本,如果沒有的話就需要尋找有類似功能的軟件做替換。

編譯遷移

代碼遷移:對於編譯型語言,一些宏定義如果代碼是 x86上面運行的就不做修改。解釋型語言在鯤鵬服務器上安裝 JDK 就可以,但是要注意 Java 依賴庫可能需要把 C 庫做遷移。
軟件包遷移:首先需要掃描該軟件包是否存在依賴庫或者依賴的可執行程序,這些庫和可執行程序如果是用 C 語言寫的是需要重新編譯的,編譯之後重新把軟件包打包即可。

性能調優

性能調優主要分爲建立基準 、壓力測試 、確定瓶頸、 實施優化、 確認效果五個步驟。首先需要確認調優的目標是什麼、業務指標是什麼,有了目標以後,後邊所有動作圍繞這個目標而來:測試,找瓶頸等。這是一個循環的過程,一步步優化和確認效果,如果有負面效果就回退。

測試與認證

和日常軟件開發一樣,需要對其進行功能、性能、長穩等層層測試,以確保能達到商用標準。此外也可以拿軟件和系統到鯤鵬上做鯤鵬展翅認證,可以擴展應用的軟件使用空間並能夠加入鯤鵬生態。

接下來我們將聚焦到具體如何做遷移。

C/C++ 代碼遷移

因爲 x86 和鯤鵬處理器在架構、指令集、向量寄存器方面的差異,C、C++、GO 這些典型的編譯型語言從 x86 平臺移植到鯤鵬平臺時一般都需要重新編譯才能運行。

在 C/C++ 編譯構建過程中,代碼工程主要包括編譯構建腳本、C/C++ 源碼這兩類文件,會對這兩類文件包括腳本選項、宏、builtin 函數等方面的修改。

C/C++代碼編譯構建過程主要分爲以下幾步:

獲取源碼,可以通過 GitHub 等開源社區來獲取;
選擇所需的編譯環境,就是安裝編譯器 gcc 等;
根據源碼的編譯腳本生成 Makefile 文件;
再用 Makefile 編譯生成可持續文件;
如果這部分代碼之中有依賴 x86 平臺的 SO 庫,那麼這部分的依賴庫需要重新編譯替換;
在編譯完成之後進行安裝部署,之後進入到實際的系統之中進行測試。

C/C++ 代碼遷移典型移植類問題

編譯腳本和編譯選項移植:比如說 64 位編譯在 x86 上是 -m64,對應到鯤鵬上是用 -mabi=lp64 的編譯選項,此類編譯選項需要在腳本中修改;此外, x86 平臺上默認的 char 類型是一種有符號的類型,對應到鯤鵬上則是無符號類型,在移植過程中需要顯示定義並將 char 類型定義爲有符號。
編譯宏的移植:編譯器自己內部帶的宏 x86 上可以直接定義,可以把宏的名稱改成-aarch64。對於平臺屬性意義編譯宏的移植,x86 系列 -amd64 下面 SIMD 指定的宏要換成對應的。
builtin 函數移植:Builtin 函數是編譯器自帶的函數,需要移植的普通 builtin 函數實際並不多,大部分需移植的 builtin 函數集中在 SSE intrinsic 函數內。
內聯彙編函數移植:移植時有兩種方式,第一種是彙編方式指令替換,x86 上對應的是 bswap 指令,鯤鵬對應的是 rev 指令。第二種是 builtin 函數方式替換,以 x86 的指令 popcnt 爲例,比如 popcount 是對二進制數裏面的 1 進行計數,對應到鯤鵬平臺上所替換的是 popcountll。
SSE intrinsic 函數移植:Intel 的 SIMD 擴展指令統稱 SSE,主要分爲三類,MMX 是 64 位寄存器,SSE 到 SSE4 是 28 位的,三是 AVX256 和 AVX512。鯤鵬基於 SIMD 的技術發展比較成熟,現在有些基於開源量的 NEON 庫主要是在圖象處理和視頻處理層面。x86 和鯤鵬對這些指令的含義和運算方式有區別。SSE intrinsic 函數移植的主要方法主要有兩種:1. 基於 avx2neon.h、SSE2NEON.h 開源文件移植,大家可以在鯤鵬的開源工程網站上去下載,已經有改好的相關文件。2. 手動替換移植,移植的時候看 x86 原來的指令什麼意思,放到 NEON 裏面怎麼改。

Java/Python 代碼遷移

雖然 Java/Python 等解釋型語言的代碼遷移相對來說比 C/C++ 簡單一些,遷移過程中也有一些問題需要注意。

首先是 Java 的遷移。Java 的 JDK裏面包含很多東西,最主要的就是 JRE 和 JVM。如果轉換在鯤鵬下面,首先需要安裝 JDK,JDK 的功能基本上沒有變化,但是 JDK 必須要裝支持 aarch 64 版的。在這個過程中,如果 jar 包調用了 SO 庫,x86 的 SO 庫也需要遷移,重新編譯成aarch64 版的。

再來看看 Python。Python 的遷移和 Java 有很多類似的地方,也是從環境到源碼最後到執行程序。在這個過程中要改動的點主要有兩個:
版本改動:需要對定製版本編譯,還需要進行 Python 2.X 到 Python3.X 的切換
對有依賴的 SO 庫,需要重新編譯爲 aarch64 版本的 SO 庫並替換。

Maven 遷移

Java 開發代碼一般有三個開發工具,LVY,Maven 和 Gradle,能把依賴路徑和方法配置的非常好。Maven 是 Apache 下的一個純 Java 開發的開源項目,基於項目對象模型(POM) 可以對 Java 項目進行項目構建和依賴管理。

Maven 倉庫分爲本地倉庫、遠程倉庫和中央倉庫。Maven 倉庫軟件構建流程就是將 x86 依賴文件替換爲鯤鵬依賴文件,再重新構建,直到不包含 x86 依賴。Maven 倉的部分 jar 包依賴 x86 SO,無法在鯤鵬上直接使用,需要在鯤鵬上直接編譯。部分 Jar 包已經編譯好放在鯤鵬 Maven 倉內,可以直接從鯤鵬遠程 Maven 倉庫下載 ARM 依賴文件,無需重新編譯。

軟件包遷移

常見的 Linux 發行版主要有 類 RedHat 和 類 Debian 兩個系列。類 RedHat 系統軟件包的格式是 rpm,提供 rpm 命令來安裝、卸載和升級 rpm 軟件包。

常見開發語言編譯成的應用程序一般包含二進制文件、庫文件(jar)、配置文件、幫助文件等。rpm 可以將應用程序打包,所以 rpm 包通常包含應用程序包含的這些文件。rpm 包中與處理器架構相關的有二進制文件和庫文件,所以將 x86 的 rpm 包重構到 ARM 的 rpm 包,需將 rpm 中包含有 x86 的 SO、二進制文件替換成 ARM 架構的 SO 和二進制文件。這個重構過程主要有以下步驟:

掃描:用 Dependency Advisor 工具掃描 x86 rpm,識別 x86 依賴文件。
編譯:如果識別到該 rpm 包裏的 jar 依賴文件沒有在鯤鵬 Maven 倉庫中找到,必須要重新編譯,SO 或其他二進制文件也需要重新編譯。
打包:首先生成一個 spec 文件,然後解壓 x86 rpm 包,將編譯好的組件替換掉 x86 rpm 包中的對應文件,最後重新打包。
驗證:重新掃描 rpm 包,確認是否還有 x86 依賴文件,如果掃描結果沒有,則進行安裝驗證。

應用遷移案例分享

Maven 構建遷移案例:NiFi

NiFi 是基於 Java 開發的開源大數據工作流平臺,將各個數據處理環節模塊化,簡化大數據開發。這個案例中在執行 Maven 數據終出現了左側的報錯,找不到 64 的 jar 包。

面對這種問題,我們首先會排查網絡的原因,這是因爲在執行 Maven 的過程中會解析配置文件分析裏面的依賴,根據這個標籤判斷是否加載。如果裏面有這個 jar 包的話就可以直接使用,如果在本地沒有 jar 包就要去下載。如果下載不下來,獲取不到這個 jar 包就會終止,報一個找不到 jar 包的錯誤。

這個案例裏網絡是正常的。往後分析,想要查找一下這個 jar 包是否存在,就可以通過配置來去查找 jar 包路徑,可以通過這些標籤找到一些地址,然後找到路徑。classifire 是一個 64 的版本,我們發現只有 x86 的 jar 包,所以纔會報這個錯誤。

面對這種情況我們首先想到獲取源碼,編譯這個 jar 包。可以看到 SCOPE 下面是 TEST,它是用來測試用的,所以影響範圍還是可控的,我們就把它屏蔽掉,後續採用手動測試的方式來去測試它的影響功能,這樣就可以完成遷移了。

總結一下,Maven 的遷移思路是:
如果在 Maven 打包,編譯打包失敗的情況下,通常首先會檢查下載的 jar 包是不是失敗了。這裏首先也是要看一下網絡的問題,是不是能正常訪問,如果可以正常訪問,我們就檢查一下 POM 的配置,根據配置去倉庫裏面查找是否能找到這個 jar 包。同時也要檢查 POM 的其他配置是否正確。

如果前面沒有問題,我們要看一下是不是 jar 包調用有錯誤。可以通過鯤鵬開發套件進行掃描,檢查一下 jar 包是不是調用了 x86 架構的 SO 文件,如果有的話就要獲取到源碼重新去編譯,直到沒有 x86 架構的 SO 庫。重新編譯之後手動做一些替換,再重新的進行打包編譯,就可以完成 Maven 的遷移。

Python 遷移案例

Pandas 遷移

Pandas 是 Python 的數據分析包,基於 NUMPY 的工具,用於解決數據分析任務。

上圖這個報錯是找不到模塊。遇到這種報錯,首先檢查是不是有安裝 NUMPY,發現安裝了 1.11.3 這個版本的 NUMPY,然後找有沒有 BUILD-UTIS 模塊。實際上在這個裏面定義了最低版本是 1.13.3,和實際安裝的不一致。升級 NUMPY 之後這個問題就得到了解決。

OpenCV-Python 遷移

基於 Python 預編譯的 OpenCV 包主要用於圖象處理和計算機視覺。在這個遷移過程中遇到了一個 CLONE 的報錯,發現沒有外網的環境導致 CLONE 失敗。可以選擇手動下載子模塊到指定文件夾中,我們把 GIT CLONE 模塊屏蔽掉,是會判斷是否有 GIT 文件。如果有的話,就通過 GIT CLOEN 拉取子模塊。我們的方法是註釋掉這個邏輯,手動寫入 OpenCV 版本信息。修改完之後重新安裝,就可以解決這個問題。

總結 Python 遷移的一般的思路:
首先也是通過官方的手冊,然後結合 setup.py 分析依賴信息。
關注依賴的倉庫。檢查網絡是否聯通,如果聯通一種是可以通過 PIP 進行安裝,另一種如果網絡有問題,我們可以通過源碼編譯安裝,或者編譯一些可以訪問的源。
注意 SO 的加載,關注無法解析。如果是 x86 的,還是要進行替換,通過源碼編譯安裝,或者下載一些已經提供的編譯好的包進行替換,最終重新編譯。

寫在最後

隨着新基建浪潮的來襲,ARM 平臺展現出了自身強大的潛力,從 x86 到 ARM 的轉換也將成爲國內 IT 基礎設施架構的趨勢。鯤鵬基於處理器,構建了從底層服務器到存儲到上層應用軟件的全棧 IT 領域。結合更多元的算力,鯤鵬將打造算力產業的堅實底座。

爲激發行業創新,促進人才培養,全國各地的鯤鵬生態創新中心正在聯合舉辦鯤鵬應用創新大賽,目前共有北京、重慶、福建、廣州、廣西、河南、湖南、江蘇、陝西、深圳、四川、天津和浙江 13 個區域賽區。大賽的陝西賽區主要面向企業參賽者,參賽作品須有 demo 演示,並且要在作品提交截止時間之前完成鯤鵬認證流程的發起和完成兼容性測試並在線輸出測試報告,並把測試報告(或兼容性認證證書)與參賽作品一起提交。

陝西賽區獎項激勵總額 42 萬,獎項設置包括 “政府”、 “大數據”、“ARM 原生應用”和“開放命題” 4 個賽題,獎項設置一致:
一等獎:4 個團隊(每賽題 1 個團隊),每團隊獎勵:50000 元現金。
二等獎:4 個團隊(每賽題 1 個團隊),每團隊獎勵:30000 元現金。
三等獎:4 個團隊(每賽題 1 個團隊),每團隊獎勵:20000 元現金。

此外,“金融”賽題只設置一等獎(1 個團隊),團隊獎勵:20000 元。

點擊鏈接獲取鯤鵬應用創新大賽 2020 陝西賽區的更多詳情及報名信息

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章