作者介紹
謝依暉
湖南大學碩士研究生在讀,
本科畢業于湖南大學計算機科學與技術專業
本文調研了4篇與OpenMP優化相關的文獻,對優化點分析如下:
面向Open64的OpenMP程序優化[1]
跨越過程邊界的并行區重構
Open64有著過程間分析優化部件,因此可以知道哪些函數使用了被調函數,從而可以通過在使用被調函數處放置合適的編譯指導語句來完成并行區重構。
這樣做的好處是:
進一步擴大并行塊的大小;
將并行塊提升到調用函數中,便于進一步對調用函數中的并行塊合并。
以下給出例子:
programmain callsub_procedure end subroutinesub_procedure !$ompparallel P !$ompendparallel end
優化后:
programmain !$ompparallel callsub_procedure !$ompendparallel end subroutinesub_procedure P end
OpenMP并行編程模型與性能優化方法的研究及應用[2]
Cache命中率優化
數組合并:定義兩個數組val[N]和key[N],在順序訪問val[i]和key[i]時可能會導致Cache沖突失效,若改為struct merge{key, val}就可以通過提高空間局部性減少Cache失效次數。
循環交換:C按行存儲而Fortran按列存儲,應根據存儲的順序來訪問。
提取關鍵數據:提取關鍵數據可以減少重復存取的數據,例如在排序中用關鍵字和指針代替整個記錄排序,這樣就能讓Cache無需存放無關數據而提高命中率。
分塊:對于極大大小的數組,要在Cache中一次容納整個數組是有困難的,但可以將數組分為多塊,可有效降低Cache失效率。
循環調度優化
在OpenMP中可對并行循環指定調度方案,以將每個迭代分配給多個工作線程執行。其一般形式如下:
#pragmaompforschedule(schedule_name,chunk_size) for(i=0;i
OpenMP編譯與優化技術研究[3]
論文中給出了一種使用啟發式規則來估計各種額外開銷和調度參數的關系,得到一個線性不等式組,可以通過求解該不等式組得到較優的調度參數。
變量屬性的優化
在OpenMP語句中每一次對變量的聲明都對應一次新的地址分配。給出以下例子:
#pragmaompparallel { #pragmaompforprivate(a) {...} #pragmaompforprivate(a) {...} }
在如上代碼中,編譯器會為每個循環分配一個單獨的私有變量,而優化后的代碼如下所示:
#pragmaompparallelprivate(a) { #pragmaompfor {...} #pragmaompfor {...} }
How to Get Good Performance by Using OpenMP[4]
去除依賴
對于某些循環語句,存在依賴而導致無法使用OpenMP優化,但是這其中的某些依賴可以通過修改代碼去除依賴而使用OpenMP運行代碼。
下列循環存在反依賴:
for(inti=0;i
除去循環之間的依賴后:
#pragmaompparallelforshared(a,a_copy) for(inti=0;i
下列循環存在流依賴:
for(inti=1;i
在loop skewing之后:
b[1]=b[1]+a[0] #pragmaompparallelforshared(a,b,c) for(inti=1;i
負載不均衡
下段代碼使用流水線形式處理,以塊的形式讀取數據,然后處理每個塊并在下一個塊之前將結果寫入磁盤,造成極差的負載均衡。
for(i=0;i
接下來這段代碼使用動態調度來重疊I/O和處理數據,將上述流水線代碼并行化。
#pragmaompparallel { /*preloaddatatobeusedinfirstiterationofthei-loop*/ #pragmaompsingle {ReadFromFile(O,...);} for(i=0;i
解決偽共享問題
inta[Nthreads][cache_line_size]; #pragmaompparallelforshared(Nthreads,a)schedule(static,1) for(inti=0;i
一般情況下,int型變量占四個字節,A[0]和A[1]的地址只差四個字節,小于一個Cache行,它們有著極大的可能在同一Cache行內,從而導致同時更新不同處理器的相同Cache行中的單個元素會導致整個Cache行無效。
對于False sharing問題,一般可以通過填充數組來優化。
inta[Nthreads][cache_line_size]; #pragmaompparallelforshared(Nthreads,a)schedule(static,1) for(inti=0;i
我們還對文獻中的部分優化使用LLVM Flang編譯器和classic-flang編譯器進行了測試,測試結果請參考https://gitee.com/src-openeuler/flang/pulls/22/files。
審核編輯:湯梓紅
-
優化
+關注
關注
0文章
220瀏覽量
23942 -
函數
+關注
關注
3文章
4345瀏覽量
62874 -
OpenMP
+關注
關注
0文章
12瀏覽量
5642
原文標題:OpenMP優化調研系列文章(3)
文章出處:【微信號:openEulercommunity,微信公眾號:openEuler】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論