<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于龍芯2F的Glibc庫優(yōu)化

          基于龍芯2F的Glibc庫優(yōu)化

          作者: 時(shí)間:2010-12-14 來源:網(wǎng)絡(luò) 收藏

          摘要:Glibc庫是Linux系統(tǒng)最底層的函數(shù)庫。本文分析了Glibc庫的函數(shù)構(gòu)成,在龍芯2F平臺上對其中的字符串與內(nèi)存的處理、數(shù)據(jù)轉(zhuǎn)換、哈希表查找、以及加密函數(shù)的代碼優(yōu)化。實(shí)驗(yàn)結(jié)果表明,大部分函數(shù)的優(yōu)化比率達(dá)到了30%以上,對龍芯2F平臺的整體運(yùn)行性能提升具有重要意義。
          關(guān)鍵詞:Glibc;龍芯2F;優(yōu)化

          0 引言
          龍芯2F是中國科學(xué)院計(jì)算技術(shù)研究所研制的高性能通用處理器,具有低功耗、低成本以及自主安全的特點(diǎn),已應(yīng)用于高性能計(jì)算和日常生活領(lǐng)域。
          龍芯2F以開源的Linux作為操作系統(tǒng)。Glibe庫是Linux系統(tǒng)最底層的運(yùn)行庫,為其上的應(yīng)用程序提供系統(tǒng)接口以及其它功能函數(shù)。此外,它還是以 構(gòu)建開發(fā)程序時(shí)使用的基本函數(shù)庫。本文基于龍芯2F體系結(jié)構(gòu)對Glibc庫進(jìn)行優(yōu)化,對于提升龍芯2F的平臺性能與用戶體驗(yàn)有重要意義。

          1 Glibc庫介紹
          Glibc庫是GNU發(fā)布的C運(yùn)行庫,它封裝了Linux操作系統(tǒng)提供的系統(tǒng)服務(wù),除此之外,還提供了其它必要的功能服務(wù)實(shí)現(xiàn)。Glibc庫是Li- nux系統(tǒng)最底層的函數(shù)庫,是除了操作系統(tǒng)核心以外,所有應(yīng)用程序賴以執(zhí)行的基礎(chǔ)環(huán)境。Linux系統(tǒng)上的其它函數(shù)庫都需要直接或間接依賴于Glibc 庫。
          Glibc庫包含兩類函數(shù),一種是與核心溝通的系統(tǒng)函數(shù),它們封裝了系統(tǒng)調(diào)用,對傳入?yún)?shù)進(jìn)行預(yù)處理之后就轉(zhuǎn)到系統(tǒng)調(diào)用來完成功能,其目的是使得用戶可以方便地使用操作系統(tǒng)核心提供的服務(wù)。系統(tǒng)調(diào)用接口與Linux操作系統(tǒng)相關(guān),大部分流程固定,沒有太大優(yōu)化余地,對
          其不做處理。
          C庫中的另一類函數(shù)提供常見的通用功能實(shí)現(xiàn),包括標(biāo)準(zhǔn)輸入輸出控制,字符串處理,正則表達(dá)式,字符串加密,查找與排序等。它們提供基本的、與操作系統(tǒng)無關(guān)的功能,其中的部分函數(shù)有一定的計(jì)算量,是優(yōu)化工作關(guān)注的部分。
          Glibc庫的版本在不斷更新,本文以當(dāng)前最新的Glibc2.11版本為基礎(chǔ)進(jìn)行優(yōu)化。

          2 龍芯2F體系結(jié)構(gòu)
          龍芯2F處理器實(shí)現(xiàn)了64位的MIPSⅢ指令集,整數(shù)寄存器和浮點(diǎn)寄存器均為64位,支持o32/n32和n64的ABI類型。除了 MIPS標(biāo)準(zhǔn)指令外,龍芯2F還提供了特有的整型計(jì)算和浮點(diǎn)計(jì)算指令。整型指令包括單條指令對3個(gè)寄存器進(jìn)行操作的乘法、除法以及求模運(yùn)算,浮點(diǎn)指令包括
          乘加、開平方等運(yùn)算。
          龍芯2F包含兩級Cache結(jié)構(gòu),L1 Cache數(shù)據(jù)和指令獨(dú)立,均為64kB;L2 Cache數(shù)據(jù)和指令共享,為512kB。L1 cache和L2 cache都采用四路組相聯(lián)結(jié)構(gòu),組內(nèi)采用隨機(jī)替換策略,cache行大小均為32字節(jié)。

          3 Glibc庫的優(yōu)化
          根據(jù)對Glibc庫組成的分析,文章對其中的字符串與內(nèi)存處理,數(shù)據(jù)轉(zhuǎn)換,哈希表查找以及加密函數(shù)進(jìn)行了優(yōu)化,以下各節(jié)分別介紹其優(yōu)化方法和優(yōu)化效果。
          3.1 字符串與內(nèi)存處理函數(shù)
          字符串與內(nèi)存處理函數(shù)組提供了較為豐富的函數(shù)來完成各種操作,包括字符串與內(nèi)存的移動、比較和查找等。兩者的操作通常一一對應(yīng),因?yàn)?a class="contentlabel" href="http://www.ex-cimer.com/news/listbylabel/label/C語言">C語言中的字符串即用一段連續(xù)的內(nèi)存來表示,區(qū)別在于字符串用空字符NULL來表示結(jié)尾,而內(nèi)存塊的結(jié)尾由其大小確定。
          對本組函數(shù)進(jìn)行分析可知,部分函數(shù)之間的實(shí)現(xiàn)流程類似,如strlen和strnlen,memcpy和memccpy等。此外某些函數(shù)可通過調(diào)用其它函數(shù)來完成,如strcpy可由strlen與memcpy函數(shù)完成。
          由于這一特點(diǎn),字符串與內(nèi)存處理函數(shù)組的優(yōu)化方法可以相互借鑒,使用的優(yōu)化方法主要包括以下幾種:
          優(yōu)化訪存指令。本組函數(shù)的處理流程一般是從一個(gè)或兩個(gè)內(nèi)存地址開始讀取內(nèi)存并進(jìn)行相應(yīng)的操作。在讀取過程中考慮內(nèi)存地址的對齊情況及讀取單位,分別使用不同格式的訪存指令。
          分塊處理。根據(jù)龍芯2F處理器的寄存器個(gè)數(shù)將待處理的字符串或內(nèi)存分塊,以充分利用寄存器進(jìn)行循環(huán)展開。
          匯編實(shí)現(xiàn)。本組函數(shù)包含了一些使用頻繁且對系統(tǒng)性能影響較大的函數(shù),如內(nèi)存拷貝memcpy函數(shù)等,對此類函數(shù)我們使用匯編或內(nèi)嵌匯編來實(shí)現(xiàn),以避免編譯器可能生成低效的代碼。
          表l是本組函數(shù)中主要函數(shù)的優(yōu)化效果,以字符串規(guī)模或內(nèi)存大小512B作為輸入。

          a.JPG


          上一頁 1 2 3 下一頁

          關(guān)鍵詞: C語言

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();