作者介紹
謝依暉
湖南大學(xué)碩士研究生在讀,
本科畢業(yè)于湖南大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)專業(yè)
Abstract
本文調(diào)研了一些對OpenMP進(jìn)行優(yōu)化的方法:
H. Ma, R. Zhao, X. Gao and Y. Zhang針對OpenMP程序中的barrier提出幾種新功能的支持和性能的優(yōu)化[1];
在SC20的Booth Talks上,Johannes Doerfert分享了在LLVM上對OpenMP做的一些優(yōu)化[2]。
Barrier Optimization for OpenMP Program[1]
刪除冗余的barrier
通過并行數(shù)據(jù)流分析,兩個(gè)循環(huán)之間無數(shù)據(jù)依賴,所以S1的barrier是冗余的;parallel結(jié)束的時(shí)候有一個(gè)隱式的barrier,所以S2的barrier也是冗余的。
!$ompparallel !$ompdo doi=1,100 a(i)=d(i) enddo!barrierS1 !$ompenddo !$ompdo doi=1,100 b(i)=c(i) enddo!barrierS2 !$ompenddo !$ompendparallel
優(yōu)化時(shí),可以在該語句塊加上顯式的nowait(!$omp end do nowait)。
當(dāng)并行化循環(huán)的時(shí)候,如果循環(huán)依賴距離是一個(gè)常數(shù),如下代碼:
doi=2,100 doj=2,100 a(i,j)=a(i-1,j)+a(i,j-1) enddo enddo
對外層循環(huán)i進(jìn)行數(shù)據(jù)依賴檢查,可以得到a[i][j]和a[i-1][j]之間的依賴距離為1。因此循環(huán)可以以DOACROSS并行的方式運(yùn)行。OpenMP只實(shí)現(xiàn)了DOALL并行,沒有與DOACROSS對應(yīng)的語句。
實(shí)現(xiàn)時(shí),定義共享數(shù)組“_mylocks [ threadid ]”來存儲(chǔ)每個(gè)線程的事件,定義私有變量_counter0指示當(dāng)前線程正在等待的事件。數(shù)組“_mylocks”中的元素總數(shù)是線程數(shù),每個(gè)元素表示相應(yīng)線程的當(dāng)前狀態(tài)。實(shí)現(xiàn)的代碼如下:
int_mylocks[256];//thread'ssynchronizedarray #pragmaompparallel { int_counter0=l; int_my_id=omp_get_thread_num(); int_my_nprocs=omp_get_num_threads(); _mylocks[my_id]= 0; for (j_tile=0;j_tile0){ do{ #pragmaompflush(_mylock) }while(_mylock[myid-l]
Region Barrier
當(dāng)線程遇到region barrier時(shí)會(huì)繼續(xù)執(zhí)行。但是直到其他所有線程都進(jìn)入這個(gè)區(qū)域之后,它才能運(yùn)行出該區(qū)域。這樣的好處是允許線程繼續(xù)運(yùn)行而不空轉(zhuǎn),可以實(shí)現(xiàn)CPU的負(fù)載均衡。
region barrier的實(shí)現(xiàn)代碼如下:
unsigned_counter=0; #pragmaompparallel { {firstparallelregion} #pragmaompatomic _counter++; {barrierregion} #pragmaompflush(counter) while(counter%omp_get_num_threads()) { #pragmaompflush(counter) } #pragmaompflush {thirdparallelregion} }
當(dāng)使用region barrier時(shí),需要保證并行域R1和R3與并行域R2無依賴關(guān)系。
OpenMP SC20 Booth Talk Series : OpenMP compiler optimizations in LLVM [2]
OpenMP運(yùn)行時(shí)調(diào)用重復(fù)數(shù)據(jù)的消除
double*A=malloc(size*omp_get_thread_limit()); double*B=malloc(size*omp_get_thread_limit()); #pragmaompparallel do_work(&A[omp_get_thread_num()*size]); #pragmaompparallel do_work(&B[omp_get_thread_num()*size]);
示例代碼中重復(fù)調(diào)用了omp_get_thread_limit()和omp_get_thread_num()函數(shù),可以將重復(fù)調(diào)用合并至一次調(diào)用。該功能已在LLVM實(shí)現(xiàn),可通過如下編譯選項(xiàng)進(jìn)行優(yōu)化:
$clangdeduplicate.c-g-O2-fopenmp-Rpass=openmp-opt
Tracking OpenMP Internal Control Variables
voidfoo(){ #pragmaompparallel bar(); } voidbar(){ if(omp_in_parallel()){ ... }else{ ... } }
以上代碼,如果omp_in_parallel()的返回值可以判斷為真,那么這個(gè)if結(jié)構(gòu)就可以被刪除。
審核編輯:湯梓紅
-
優(yōu)化
+關(guān)注
關(guān)注
0文章
220瀏覽量
24157 -
OpenMP
+關(guān)注
關(guān)注
0文章
12瀏覽量
5747 -
abstract
+關(guān)注
關(guān)注
0文章
4瀏覽量
1717
原文標(biāo)題:OpenMP優(yōu)化調(diào)研系列文章(1)
文章出處:【微信號(hào):openEulercommunity,微信公眾號(hào):openEuler】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
關(guān)于java性能優(yōu)化的一些細(xì)節(jié)
openmp的相關(guān)資料下載
OpenMP優(yōu)化調(diào)研系列文章(1)
OpenMP優(yōu)化調(diào)研系列文章(3)
一些在文本數(shù)據(jù)量不夠大的時(shí)候可用的一些實(shí)用方法

5G網(wǎng)絡(luò)優(yōu)化的一些案例資料下載

Zigbee 3.0網(wǎng)絡(luò)優(yōu)化的一些方法和建議
嵌入式linux系統(tǒng)快速啟動(dòng)優(yōu)化的一些方法

NEON編程中的一些常見優(yōu)化技巧
介紹得物App在資源優(yōu)化上做的一些實(shí)踐

評論