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