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