項目簡介
項目名稱
畢昇Fortran編譯器內(nèi)聯(lián)動態(tài)庫函數(shù)str_copy
項目描述
畢昇Fortran編譯器是一款基于classic flang的高性能Fortran編譯器,支持Fortran編程語言的編譯和運行,提供強大的數(shù)值計算和數(shù)據(jù)處理能力,在科學(xué)計算領(lǐng)域應(yīng)用前景廣闊。f90_str_copy_klen是一個實現(xiàn)字符串拷貝功能的動態(tài)庫函數(shù),本項目是對該動態(tài)庫函數(shù)進行內(nèi)聯(lián),預(yù)期提高編譯器字符串拷貝的性能。
項目導(dǎo)師
peixin-qiao
項目開發(fā)者
王哲葳,華東師范大學(xué)碩士在讀
項目鏈接
https://summer-ospp.ac.cn/#/org/prodetail/22b970386
開發(fā)詳情
方案描述
Flang編譯器主要由flang1和flang2兩個組件組成,其中flang1用于解析Fortran代碼并生成中間表示,然后通過flang2生成LLVM IR并輸出。本項目的主要任務(wù)就是在flang2中對解析出的“f90_str_copy_klen”函數(shù)進行內(nèi)聯(lián)優(yōu)化。這個項目的方案分為如下幾步:
01
flang2會獲得通過Fortran生成的IR指令列表,遍歷該列表,尋找到函數(shù)調(diào)用指令“I_CALL”。
02
通過“I_CALL”指令的位置查詢所調(diào)用的是否為需要被內(nèi)聯(lián)的函數(shù),如本項目需要實現(xiàn)的“f90_str_copy_klen”函數(shù)的內(nèi)聯(lián)。在確認需要內(nèi)聯(lián)的函數(shù)后開始生成相應(yīng)的指令,“f90_str_copy_klen”函數(shù)的內(nèi)聯(lián)指令生成過程如下:
-
將復(fù)制后得到的字符串稱為目標字符串,待復(fù)制的字符串稱為輸入字符串。首先需要從原先的指令中獲得輸入字符串并開辟一系列內(nèi)存空間用于記錄目標字符串、輸入字符串的起始地址、字符串索引及字符串長度。
-
對每一個輸入字符串,從頭開始遍歷。分別判斷當(dāng)前目標字符串、輸入字符串的索引是否小于其長度,如果均符合則將輸入字符串中對應(yīng)索引的字符復(fù)制到目標字符串的相應(yīng)地址中。如果輸入字符串索引大于等于其長度則處理下一個輸入字符串。如果目標字符串索引大于等于其長度則停止字符串的復(fù)制。
-
按照2所述流程依次遍歷函數(shù)中的輸入字符串,直至所有字符串都完成復(fù)制。
-
目標字符串索引是否仍小于其長度,若是,則將目標字符串中剩余未被賦值的字符用空格進行補充。
-
將實現(xiàn)上述功能的指令替換掉對應(yīng)的“I_CALL”指令。
03
繼續(xù)flang2中的流程以生成對應(yīng)的LLVM IR 文件。
項目產(chǎn)出
實現(xiàn)了項目方案中所需的功能。
分別用一個字符串、三個字符串作為輸入字符串,完成了共十種輸入字符串各種長度情況下”f90_str_copy_klen”函數(shù)內(nèi)聯(lián)的的功能性測試,在這些輸入字符串中也包含了一些ASCII碼小于32(ASCII碼為32表示空格)的特殊字符。十種情況如下:
-
a=b
- len(a) < len(b)
- len(a) = len(b)
- len(a) > len(b)
-
a = b // c // d
- len(a) < len(b)
- len(a) = len(b)
- len(b) < len(a) < len(b) + len(c)
- len(a) = len(b) + len(c)
- len(b) + len(c) < len(a) < len(b) + len(c) + len(d)
- len(a) = len(b) + len(c) + len(d)
- len(a) > len(b) + len(c) + len(d)
將“f90_str_copy_klen”在函數(shù)中調(diào)用一億次,對內(nèi)聯(lián)前后所花費的時間做對比。實驗結(jié)果顯示沒有內(nèi)聯(lián)時運行花費的時間約為10秒,內(nèi)聯(lián)后運行花費的時間約為0.7秒。
-
測試代碼如下:
主函數(shù):main.f90programmain integer::i character(20)::a,b,c,d a="aaaaaaaaaaaaaaa" b="aaaaaaaaaaaaaaa" c="aaaaaaaaaaaaaaa" doi=1,100000000 calltest(a,b,c,d,20) enddo end
字符串拼接拷貝函數(shù):test.f90
subroutinetest(a,b,c,d,n) integer::n character(n)::a,b,c,d d=a//b//c endsubroutine
-
測試方法如下:
未優(yōu)化前:$flangmain.f90-c $flangtest.f90-O3-c $flangmain.otest.o-oa.out $time./a.out
real0m10.190s
user0m10.180s
sys0m0.004s優(yōu)化之后(編譯選項-Mx,218,0x1使能該優(yōu)化功能):
$flangmain.f90-c $flangtest.f90-O3–c–Mx,218,0x1 $flangmain.otest.o-oa.out $time./a.out
real0m0.706s
user0m0.702s
sys0m0.004s
審核編輯 :李倩
-
函數(shù)
+關(guān)注
關(guān)注
3文章
4341瀏覽量
62800 -
編譯器
+關(guān)注
關(guān)注
1文章
1638瀏覽量
49197 -
Fortran
+關(guān)注
關(guān)注
1文章
7瀏覽量
7660
原文標題:開源之夏 | 【結(jié)項報告】畢昇Fortran編譯器內(nèi)聯(lián)動態(tài)庫函數(shù)str_copy
文章出處:【微信號:openEulercommunity,微信公眾號:openEuler】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論