基于龍芯2F的Glibc庫優化
由于龍芯2F只支持小尾端的字符序,因此SHA算法首先將進行運算的字轉換為大尾端。原始實現中使用表達式x=((n24)| ((n&0xff00)8)|((n>>8)&0xff00)|(n>>24))進行轉換,其中n為無符號的 32位整數。該轉換操作總共需要兩次與,四次移位與三次或運算,我們對其
進行改進,采用二分方的思想,使用表達式n1=(n16)|(n>>16)和x=(((n1&0xff00ff00) gt;>8)|(n1&0xff00ff)8))。其中計算n1的表達式可以由編譯器編譯為一條循環移位指令,這樣改進的實現共需要兩次與,三次移位與一次或運算,省去了一次移位與兩次或運算。
算法接下來的操作是消息擴散與迭代計算,計算公式分別如圖3和圖4所示。本文引用地址:http://www.j9360.com/article/173058.htm
我們對其計算過程進行層數為2的循環展開。對于迭代計算過程,循環展開之后還可以繼續進行賦值傳遞優化,減少運算量和迭代次數。循環展開層數增加時,循環次數減小,但增加了循環內的計算量,寄存器的數目滿足不了中間結果的保存,需要讀寫內存,反而造成性能的下降。經過實驗確定,層數為2是一個較好的選擇。
表2是改進前后SHA256算法的性能對比,取數據大小從64B到2kB倍增。
4 總結
Glibc庫是Linux系統最底層的運行庫,是所有應用程序賴以執行的基礎環境。本文基于龍芯2F平臺對Glibc庫中的字符串與內存處理函數、數據轉換函數、哈希表查找函數以及加密函數進行了代碼優化,大部分函數的優化比率達到30%以上,對龍芯2F平臺的整體運行性能提升具有重要意義。
評論