基於龍芯2F的Glibc庫優化

2020-12-27 電子產品世界

摘要: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作為輸入。


相關焦點

  • 龍芯. NET正式發布 基於.NET Core 3.1支持包括GC、AOT等功能
    從龍芯中科獲悉,12 月 19 日,2020 中國 . NET 開發者大會於蘇州開幕。會上,龍芯 . NET 正式發布。   龍芯表示,此次發布的龍芯 . NET 3 基於 . NET Core 3.1,支持該版本具備的所有主要功能,包括 GC、AOT 等。
  • 天津光電推出基於龍芯的系列雷射印表機
    IT之家8月6日消息 近期,龍芯 1C0300B 作為主控晶片已批量應用在天津光電出品的多款雷射印表機中,在列印掃描、通信控制和協議解析方面發揮著重要的作用。通過對數據傳輸和處理的管控,以及對一鍵清除內存的支持,龍芯 1C0300B 可以充分保障數據的安全性。
  • 國產自研晶片新時代 龍芯A4000評測_龍芯 3A4000_遊戲硬體CPU...
    此外架構龍芯3A4000處理器升級為了GS464V,支持MIPS64指令集,並且在原只有500條MIPS64指令數基礎上,自行擴展了1000多條。     整體看來與上一代3A3000相比,龍芯3A4000處理器除了性能上會有大幅提升,更在安全和加密上做了升級和優化,內置增加安全模塊,並且支持多種加解密算法。
  • 打造IT產業新生態:龍芯發布新一代處理器
    28nm工藝 主頻達2.0GHz據介紹,龍芯3A4000/3B4000使用與上一代產品3A3000/3B3000相同的28nm工藝,通過設計優化成倍提升性能。具體來看,3A4000/3B4000使用龍芯最新研製的新一代處理器核GS464V,主頻1.8GHz-2.0GHz,SPEC CPU2006定點和浮點單核分值均超過20分,是上一代產品的兩倍以上。通過優化功耗管理,基於龍芯3A4000的筆記本工作時間比上一代產品延長一倍以上。
  • 嵌入式Linux啟動時間優化的秘密之一工具鏈/應用程式優化
    您可以在工具鏈中進行以下更改,這可能會影響啟動時間,性能和大小:   編譯器版本:gcc和binutils的版本,最新版本往往可以具有更好的優化功能。   C庫:glibc,uClibc,musl。使用uClibc和musl庫編譯的根文件系統更小   指令集變量:ARM或Thumb2,是否支持硬浮點。
  • 龍芯UOS系統全面預裝搜狗輸入法Linux版
    最新消息,龍芯中科、統信軟體和搜狗輸入法三方達成合作,龍芯版UOS系統將全面預裝搜狗輸入法Linux版。據悉,全新的搜狗輸入法Linux版依託於搜狗最新跨平臺輸入法架構,擁有語音、手寫、外語輸入能力以及雲端能力。
  • glibc中的printf如何輸出到串口
    本文分析了printf和文件描述符0、1和2以及stdout、stdin和stderr的關係,通過這篇文章可以知道文件描述符0、1和2為什麼對應著stdout、stdin和stderr,因為glibc就是這麼定義的!!!
  • 龍芯創立啟動"龍芯教育"品牌 打造自主創新生態教育聯盟
    在本次會議中,龍芯中科與航天龍夢、清華同方、金山、極域、騰邦發起並成立了基於龍芯的教育產業聯盟,並推出了多套基於國產龍芯平臺的教育解決方案。至此,晶片產業自主生態鏈人才建設以及我國計算機領域創新人才的培養計劃起到了加速推進舉措,為信息技術領域教育建設指引方向。
  • 「處女座」的龍芯都有哪些朋友?(下)
    對於需求有邊界的情況,例如窗口服務、銀行系統、企業辦公、政府服務、國防安全這類不允許超出功能範圍的應用,龍芯適配的Linux完全可以滿足。所以,中科夢蘭的戰略(其實也是龍芯的戰略),一直是先打開企業、政府、伺服器這類的團體市場。在8月18日龍芯新品發布會上,航天科工集團就推出了基於龍芯研發的安全計算機。
  • 龍芯.NET正式發布 開源共享與開發者共成長
    此次開發者大會上,龍芯.NET項目及JVM負責人敖琪博士發表了《龍芯.NET到來》主題演講,並正式發布龍芯.NET。這意味著國產龍芯已支持.NET,具備更為靈活的部署能力,也將進一步完善龍芯軟體生態開發體系。
  • 幾年前看龍芯笑話的人,現在都得跪下來向龍芯認錯
    幾年以來,從龍芯第一次正式對外發布產品之時,嘲笑和謾罵就沒停止過。就像麒麟處理器使用ARM架構一樣,號稱完全自主的龍芯也是購買的MIPS架構,龍芯產業負責人向外界解釋稱:「無論你用中文還是英文寫信,總不可能自己發布一款語言才算是真正的自主信件吧!」
  • 關於Linux和Unix動態連結庫的安全
    實際上所有程序執行都依賴於庫。在包括Linux的大多數現代類Unix系統中,程序預設使用動態連接庫(DLL)進行編譯。這樣就可以更新某個庫,所有使用該庫的程序如果可能的話,都將使用新的(希望有所改進的)版本。  動態連接庫通常被放在若干特殊目錄下。
  • 龍芯UOS 系統全面預裝搜狗輸入法 Linux 版 整合拼音和五筆輸入法
    從龍芯中科獲悉,近期,龍芯中科與統信軟體、搜狗輸入法三方達成合作。通過這次合作,龍芯版 UOS 系統將全面預裝搜狗輸入法 Linux 版。  據悉,全新的搜狗輸入法 Linux 版依託於搜狗最新跨平臺輸入法架構,擁有語音、手寫、外語輸入能力以及雲端能力。
  • 當年基於動態翻譯x86的企業倒閉了,龍芯為什麼還要堅持
    二進位翻譯X86,並不是黑科技,以前這樣做的企業都失敗了,龍芯可以成功麼?本文引用地址:http://www.eepw.com.cn/article/202008/417187.htm全美達的敗場2000年1月19日,全美達宣告他們開發了一款基於動態二進位翻譯的x86處理器,命名為Crusoe。
  • glibc-2.29新增的保護機制學習總結
    趁機學習一波glibc-2.29源碼,看看對比2.27多了哪些保護措施,又有哪些利用手段失效了,並提出本人能想到的相應的應對方法。本文討論的都是基於64位環境,32位環境的結構體、偏移等需要相應變化。unlink//glibc-2.29if (!
  • glibc字符編碼研究
    在Linux glibc中wchar_t被定義為4位元組變量,用於存儲UCS-4字符。demo1中name2為指向wchar_t類型的指針,在給wchar_t類型變量賦值時需要給字符串加上「L」前綴,表示每個字符按照UCS-4格式存儲在wchar_t類型的變量中,否則中文字符還是按照UTF-8進行編碼。
  • 龍芯系統融入信息技術課程,包括機器人創客,最新教材先睹為快
    ,是龍芯學生電腦的配套教材。這套教材中涉及的軟體,是基於Linux平臺的,當然,龍芯電腦是對Linux進行了優化並適用於龍芯架構的硬體與軟體。今年的新版教材,是在原版本上進行了修訂。第40課開始,學習機器人項目,這是龍芯和合作開發定製的,適用於龍芯硬體和軟體平臺的機器人項目。
  • 開源的龍芯主板可順利啟動Linux系統
    據了解,龍芯俱樂部和廣州龍芯經過3個版本的研發,龍芯1C開源主板已經調試成功,可以順利啟動Linux系統了。  龍芯1C是基於LS232 IP內核的比單晶片系統,適合各種嵌入式應用,而且採用QFP封裝,晶片引腳外露,硬體工程師可以自行手工焊接,不用機器貼片。  如果需要更多接口,還可以通過雙排插接擴展板引出,包括Arduino、Microduino、XBee等擴展模塊。
  • 國產CPU大戰:龍芯、飛騰誰更快?
    這幾年,國產桌面計算機快速發展,申威、龍芯、飛騰等CPU廠商紛紛推出了自己的桌面計算機,但用戶體驗、系統性能到底怎麼樣?相信大部分讀者還不是很清楚。這裡,我們找來了款國內比較知名CPU廠商龍芯、飛騰的臺式機產品,看看體驗到底如何。
  • 丁增賢: glibc堆探秘系列之fastbin ——下集
    當chunk的size小於128比特時(32位glibc庫為64比特),進入fastbin的處理分支。顯然我們的示例走的就是這個分支,所以其餘兩個分支的執行邏輯我們暫不考慮。在繼續之前,我們需要簡單的介紹一下本文的主角——fastbin。我們已經說過,用戶調用free函數釋放掉的內存並不會馬上歸還給作業系統。