基于龍芯2F的Glibc庫優化
摘要:Glibc庫是Linux系統最底層的函數庫。本文分析了Glibc庫的函數構成,在龍芯2F平臺上對其中的字符串與內存的處理、數據轉換、哈希表查找、以及加密函數的代碼優化。實驗結果表明,大部分函數的優化比率達到了30%以上,對龍芯2F平臺的整體運行性能提升具有重要意義。
關鍵詞:Glibc;龍芯2F;優化
0 引言
龍芯2F是中國科學院計算技術研究所研制的高性能通用處理器,具有低功耗、低成本以及自主安全的特點,已應用于高性能計算和日常生活領域。
龍芯2F以開源的Linux作為操作系統。Glibe庫是Linux系統最底層的運行庫,為其上的應用程序提供系統接口以及其它功能函數。此外,它還是以 C語言構建開發程序時使用的基本函數庫。本文基于龍芯2F體系結構對Glibc庫進行優化,對于提升龍芯2F的平臺性能與用戶體驗有重要意義。
1 Glibc庫介紹
Glibc庫是GNU發布的C運行庫,它封裝了Linux操作系統提供的系統服務,除此之外,還提供了其它必要的功能服務實現。Glibc庫是Li- nux系統最底層的函數庫,是除了操作系統核心以外,所有應用程序賴以執行的基礎環境。Linux系統上的其它函數庫都需要直接或間接依賴于Glibc 庫。
Glibc庫包含兩類函數,一種是與核心溝通的系統函數,它們封裝了系統調用,對傳入參數進行預處理之后就轉到系統調用來完成功能,其目的是使得用戶可以方便地使用操作系統核心提供的服務。系統調用接口與Linux操作系統相關,大部分流程固定,沒有太大優化余地,對
其不做處理。
C庫中的另一類函數提供常見的通用功能實現,包括標準輸入輸出控制,字符串處理,正則表達式,字符串加密,查找與排序等。它們提供基本的、與操作系統無關的功能,其中的部分函數有一定的計算量,是優化工作關注的部分。
Glibc庫的版本在不斷更新,本文以當前最新的Glibc2.11版本為基礎進行優化。
2 龍芯2F體系結構
龍芯2F處理器實現了64位的MIPSⅢ指令集,整數寄存器和浮點寄存器均為64位,支持o32/n32和n64的ABI類型。除了 MIPS標準指令外,龍芯2F還提供了特有的整型計算和浮點計算指令。整型指令包括單條指令對3個寄存器進行操作的乘法、除法以及求模運算,浮點指令包括
乘加、開平方等運算。
龍芯2F包含兩級Cache結構,L1 Cache數據和指令獨立,均為64kB;L2 Cache數據和指令共享,為512kB。L1 cache和L2 cache都采用四路組相聯結構,組內采用隨機替換策略,cache行大小均為32字節。
3 Glibc庫的優化
根據對Glibc庫組成的分析,文章對其中的字符串與內存處理,數據轉換,哈希表查找以及加密函數進行了優化,以下各節分別介紹其優化方法和優化效果。
3.1 字符串與內存處理函數
字符串與內存處理函數組提供了較為豐富的函數來完成各種操作,包括字符串與內存的移動、比較和查找等。兩者的操作通常一一對應,因為C語言中的字符串即用一段連續的內存來表示,區別在于字符串用空字符NULL來表示結尾,而內存塊的結尾由其大小確定。
對本組函數進行分析可知,部分函數之間的實現流程類似,如strlen和strnlen,memcpy和memccpy等。此外某些函數可通過調用其它函數來完成,如strcpy可由strlen與memcpy函數完成。
由于這一特點,字符串與內存處理函數組的優化方法可以相互借鑒,使用的優化方法主要包括以下幾種:
優化訪存指令。本組函數的處理流程一般是從一個或兩個內存地址開始讀取內存并進行相應的操作。在讀取過程中考慮內存地址的對齊情況及讀取單位,分別使用不同格式的訪存指令。
分塊處理。根據龍芯2F處理器的寄存器個數將待處理的字符串或內存分塊,以充分利用寄存器進行循環展開。
匯編實現。本組函數包含了一些使用頻繁且對系統性能影響較大的函數,如內存拷貝memcpy函數等,對此類函數我們使用匯編或內嵌匯編來實現,以避免編譯器可能生成低效的代碼。
表l是本組函數中主要函數的優化效果,以字符串規模或內存大小512B作為輸入。
評論