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