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