<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

一些對OpenMP進行優化的方法

openEuler ? 來源:畢昇編譯 ? 作者:謝依暉 ? 2022-10-18 09:44 ? 次閱讀

作者介紹

謝依暉

湖南大學碩士研究生在讀,

本科畢業于湖南大學計算機科學與技術專業

Abstract

本文調研了一些對OpenMP進行優化的方法:

H. Ma, R. Zhao, X. Gao and Y. Zhang針對OpenMP程序中的barrier提出幾種新功能的支持和性能的優化[1];

在SC20的Booth Talks上,Johannes Doerfert分享了在LLVM上對OpenMP做的一些優化[2]。

Barrier Optimization for OpenMP Program[1]

刪除冗余的barrier

通過并行數據流分析,兩個循環之間無數據依賴,所以S1的barrier是冗余的;parallel結束的時候有一個隱式的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

優化時,可以在該語句塊加上顯式的nowait(!$omp end do nowait)。

實現DOACROSS并行

當并行化循環的時候,如果循環依賴距離是一個常數,如下代碼:

doi=2,100
doj=2,100
a(i,j)=a(i-1,j)+a(i,j-1)
enddo
enddo

對外層循環i進行數據依賴檢查,可以得到a[i][j]和a[i-1][j]之間的依賴距離為1。因此循環可以以DOACROSS并行的方式運行。OpenMP只實現了DOALL并行,沒有與DOACROSS對應的語句。

實現時,定義共享數組“_mylocks [ threadid ]”來存儲每個線程的事件,定義私有變量_counter0指示當前線程正在等待的事件。數組“_mylocks”中的元素總數是線程數,每個元素表示相應線程的當前狀態。實現的代碼如下:

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

當線程遇到region barrier時會繼續執行。但是直到其他所有線程都進入這個區域之后,它才能運行出該區域。這樣的好處是允許線程繼續運行而不空轉,可以實現CPU的負載均衡。

region barrier的實現代碼如下:

unsigned_counter=0;
#pragmaompparallel
{
{firstparallelregion}
#pragmaompatomic
_counter++;
{barrierregion}
#pragmaompflush(counter)
while(counter%omp_get_num_threads())
{
#pragmaompflush(counter)
}
#pragmaompflush
{thirdparallelregion}
}

當使用region barrier時,需要保證并行域R1和R3與并行域R2無依賴關系。

OpenMP SC20 Booth Talk Series : OpenMP compiler optimizations in LLVM [2]

OpenMP運行時調用重復數據的消除

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]);

示例代碼中重復調用了omp_get_thread_limit()和omp_get_thread_num()函數,可以將重復調用合并至一次調用。該功能已在LLVM實現,可通過如下編譯選項進行優化:

$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()的返回值可以判斷為真,那么這個if結構就可以被刪除。

審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 優化
    +關注

    關注

    0

    文章

    218

    瀏覽量

    23735
  • OpenMP
    +關注

    關注

    0

    文章

    12

    瀏覽量

    5586
  • abstract
    +關注

    關注

    0

    文章

    4

    瀏覽量

    1633

原文標題:OpenMP優化調研系列文章(1)

文章出處:【微信號:openEulercommunity,微信公眾號:openEuler】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    關于一些OpenMP優化的方式

    本文調研了一些OpenMP優化的方式。
    發表于 11-22 09:36 ?941次閱讀

    單片機C語言 深入解析 含一些優化問題

    單片機 C語言 深入解析含一些優化問題
    發表于 11-26 21:36

    arm系統中并行計算優化

    。openmp個不錯的并行優化的概念。另外arm本身還有另外優化的概念neon,我們在雙路攝像頭實現收拾識別中應用了這個技術,他的核
    發表于 12-30 14:33

    基于OpenMP的電磁場FDTD算法程序實現設計

    了采用OpenMP 技術對電磁場FDTD算法程序實現并行化的方法,并將該并行方法在三維瞬態場電偶極子輻射FDTD程序中進行了驗證,也相當于對該并行
    發表于 07-04 06:00

    關鍵詞優化有哪些實用的方法

    方法,都是需要我們慢慢的去挖掘在已有的基礎上面去拓展思維。東莞seo博客總結,我們想要做好關鍵詞優化排名,那么我們需要對于關鍵詞進行合理的布局和思考,運用以上為大家介紹的一些
    發表于 08-11 01:19

    求分享一些關于優化示波器測量的提示與技巧

    求分享一些關于優化示波器測量的提示與技巧
    發表于 05-12 06:26

    關于java性能優化一些細節

    代碼優化 ,個很重要的課題??赡苡行┤擞X得沒用,一些細小的地方有什么好修改的,改與不改對于代碼的運行效率有什么影響呢?這個問題我是這么考慮的,就像大海里面的鯨魚樣,它吃
    發表于 10-11 09:23

    openmp的相關資料下載

    嵌入式算法移植優化學習筆記1——openmp參考:1、https://www.oschina.net/p/openmp?hmsr=aladdin1e11、openmp簡介
    發表于 12-14 09:03

    分享一些以太網常用的調試方法

    對于單phy的平臺以太網技術已經很成熟,這里提供一些以太網常用的調試方法。幫助客戶快速定位常見問題。 以太網常用的命令有哪些呢?如何對其進行調試呢?
    發表于 12-29 07:32

    使用STM32cubemx進行一些串口

    STM32cubemx_W5500_TCP和Modbus/TCP以STM32f103zet6開發板為平臺使用STM32cubemx進行一些串口,spi等接口的初始化。使用的是野火的w5500模塊,以
    發表于 01-19 07:51

    講述了一些快速配置驅動的方法

    ,這個博文講述了一些快速配置驅動的方法;還有藍橋杯單片機組編程題準備 -模塊編程練習這里面有一些模塊練習題,可以很方便的記憶一些鍵盤掃描啊、定時器配置(使用STC-ISP)等的
    發表于 01-27 06:31

    教你一些使用國產芯片的方法與心得

    教你一些使用國產芯片的方法與心得
    發表于 02-28 09:44

    請問JPEG編碼如何并行優化?

    使用QT對Jpeg編碼與解碼功能進行優化,可以使用openmp,neon等各種方法
    發表于 05-16 21:25

    OpenMP優化調研系列文章(1)

    Abstract本文調研了一些OpenMP進行優化方法:H. Ma, R. Zhao, X. Gao and Y. Zhang針對
    發表于 10-28 10:18

    OpenMP優化調研系列文章(3)

    極大大小的數組,要在Cache中次容納整個數組是有困難的,但可以將數組分為多塊,可有效降低Cache失效率。循環調度優化OpenMP中可對并行循環指定調度方案,以將每個迭代分配給多個工作線程執行
    發表于 12-23 16:05
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>