0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

OpenMP優(yōu)化相關(guān)知識(shí)

openEuler ? 來(lái)源:openEuler ? 作者:openEuler ? 2022-12-06 10:25 ? 次閱讀

作者介紹

謝依暉

湖南大學(xué)碩士研究生在讀,

本科畢業(yè)于湖南大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)專(zhuān)業(yè)

本文調(diào)研了4篇與OpenMP優(yōu)化相關(guān)的文獻(xiàn),對(duì)優(yōu)化點(diǎn)分析如下:

面向Open64的OpenMP程序優(yōu)化[1]

跨越過(guò)程邊界的并行區(qū)重構(gòu)

Open64有著過(guò)程間分析優(yōu)化部件,因此可以知道哪些函數(shù)使用了被調(diào)函數(shù),從而可以通過(guò)在使用被調(diào)函數(shù)處放置合適的編譯指導(dǎo)語(yǔ)句來(lái)完成并行區(qū)重構(gòu)。

這樣做的好處是:

進(jìn)一步擴(kuò)大并行塊的大??;

將并行塊提升到調(diào)用函數(shù)中,便于進(jìn)一步對(duì)調(diào)用函數(shù)中的并行塊合并。

以下給出例子:

programmain
callsub_procedure
end

subroutinesub_procedure
!$ompparallel
P
!$ompendparallel
end

優(yōu)化后:

programmain
!$ompparallel
callsub_procedure
!$ompendparallel
end

subroutinesub_procedure
P
end

OpenMP并行編程模型與性能優(yōu)化方法的研究及應(yīng)用[2]

Cache命中率優(yōu)化

數(shù)組合并:定義兩個(gè)數(shù)組val[N]和key[N],在順序訪問(wèn)val[i]和key[i]時(shí)可能會(huì)導(dǎo)致Cache沖突失效,若改為struct merge{key, val}就可以通過(guò)提高空間局部性減少Cache失效次數(shù)。

循環(huán)交換:C按行存儲(chǔ)而Fortran按列存儲(chǔ),應(yīng)根據(jù)存儲(chǔ)的順序來(lái)訪問(wèn)。

提取關(guān)鍵數(shù)據(jù):提取關(guān)鍵數(shù)據(jù)可以減少重復(fù)存取的數(shù)據(jù),例如在排序中用關(guān)鍵字和指針代替整個(gè)記錄排序,這樣就能讓Cache無(wú)需存放無(wú)關(guān)數(shù)據(jù)而提高命中率。

分塊:對(duì)于極大大小的數(shù)組,要在Cache中一次容納整個(gè)數(shù)組是有困難的,但可以將數(shù)組分為多塊,可有效降低Cache失效率。

循環(huán)調(diào)度優(yōu)化

在OpenMP中可對(duì)并行循環(huán)指定調(diào)度方案,以將每個(gè)迭代分配給多個(gè)工作線程執(zhí)行。其一般形式如下:

#pragmaompforschedule(schedule_name,chunk_size)
for(i=0;i

OpenMP編譯與優(yōu)化技術(shù)研究[3]

論文中給出了一種使用啟發(fā)式規(guī)則來(lái)估計(jì)各種額外開(kāi)銷(xiāo)和調(diào)度參數(shù)的關(guān)系,得到一個(gè)線性不等式組,可以通過(guò)求解該不等式組得到較優(yōu)的調(diào)度參數(shù)。

變量屬性的優(yōu)化

在OpenMP語(yǔ)句中每一次對(duì)變量的聲明都對(duì)應(yīng)一次新的地址分配。給出以下例子:

#pragmaompparallel
{
#pragmaompforprivate(a)
{...}
#pragmaompforprivate(a)
{...}
}

在如上代碼中,編譯器會(huì)為每個(gè)循環(huán)分配一個(gè)單獨(dú)的私有變量,而優(yōu)化后的代碼如下所示:

#pragmaompparallelprivate(a)
{
#pragmaompfor
{...}
#pragmaompfor
{...}
}

How to Get Good Performance by Using OpenMP[4]

去除依賴(lài)

對(duì)于某些循環(huán)語(yǔ)句,存在依賴(lài)而導(dǎo)致無(wú)法使用OpenMP優(yōu)化,但是這其中的某些依賴(lài)可以通過(guò)修改代碼去除依賴(lài)而使用OpenMP運(yùn)行代碼。

下列循環(huán)存在反依賴(lài):

for(inti=0;i

除去循環(huán)之間的依賴(lài)后:

#pragmaompparallelforshared(a,a_copy)
for(inti=0;i

下列循環(huán)存在流依賴(lài):

for(inti=1;i

在loop skewing之后:

b[1]=b[1]+a[0]
#pragmaompparallelforshared(a,b,c)
for(inti=1;i

負(fù)載不均衡

下段代碼使用流水線形式處理,以塊的形式讀取數(shù)據(jù),然后處理每個(gè)塊并在下一個(gè)塊之前將結(jié)果寫(xiě)入磁盤(pán),造成極差的負(fù)載均衡。

for(i=0;i

接下來(lái)這段代碼使用動(dòng)態(tài)調(diào)度來(lái)重疊I/O和處理數(shù)據(jù),將上述流水線代碼并行化。

#pragmaompparallel
{
/*preloaddatatobeusedinfirstiterationofthei-loop*/
#pragmaompsingle
{ReadFromFile(O,...);}
for(i=0;i

解決偽共享問(wèn)題

inta[Nthreads][cache_line_size];
#pragmaompparallelforshared(Nthreads,a)schedule(static,1)
for(inti=0;i

一般情況下,int型變量占四個(gè)字節(jié),A[0]和A[1]的地址只差四個(gè)字節(jié),小于一個(gè)Cache行,它們有著極大的可能在同一Cache行內(nèi),從而導(dǎo)致同時(shí)更新不同處理器的相同Cache行中的單個(gè)元素會(huì)導(dǎo)致整個(gè)Cache行無(wú)效。

對(duì)于False sharing問(wèn)題,一般可以通過(guò)填充數(shù)組來(lái)優(yōu)化。

inta[Nthreads][cache_line_size];
#pragmaompparallelforshared(Nthreads,a)schedule(static,1)
for(inti=0;i

我們還對(duì)文獻(xiàn)中的部分優(yōu)化使用LLVM Flang編譯器和classic-flang編譯器進(jìn)行了測(cè)試,測(cè)試結(jié)果請(qǐng)參考https://gitee.com/src-openeuler/flang/pulls/22/files。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 優(yōu)化
    +關(guān)注

    關(guān)注

    0

    文章

    220

    瀏覽量

    23847
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4260

    瀏覽量

    62230
  • OpenMP
    +關(guān)注

    關(guān)注

    0

    文章

    12

    瀏覽量

    5599

原文標(biāo)題:OpenMP優(yōu)化調(diào)研系列文章(3)

文章出處:【微信號(hào):openEulercommunity,微信公眾號(hào):openEuler】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    關(guān)于一些對(duì)OpenMP優(yōu)化的方式

    本文調(diào)研了一些對(duì)OpenMP優(yōu)化的方式。
    發(fā)表于 11-22 09:36 ?1071次閱讀

    openMP的helloword的demo出錯(cuò)

    按照官方資料http://processors.wiki.ti.com/index.php/OpenMP_on_C6000#Installation,搭建了第一個(gè)案例,自己選擇的目標(biāo)配置
    發(fā)表于 06-21 00:52

    關(guān)于6678 openmp的幾個(gè)問(wèn)題

    大家好, 最近在學(xué)習(xí)6678上的omp庫(kù),遇到幾個(gè)疑問(wèn),如下 1. 我注意到,帶openmp的程序代碼段都是放在msmc里的,當(dāng)多個(gè)核都進(jìn)入到并行域時(shí),都是在msmc的同一個(gè)地址執(zhí)行代碼的,我想問(wèn)1
    發(fā)表于 06-21 11:21

    C6678 openMP 例程 連接出錯(cuò)

    用的芯片是c6678,開(kāi)發(fā)板是TMDSEVM6678L,開(kāi)發(fā)環(huán)境ccs5.2。mcsdk2.1.2.5。openMP1.1.3.02 跑的是biosMulticore sdk 中的openMP例程
    發(fā)表于 06-21 00:52

    linux下的openmp編程基礎(chǔ)知識(shí)介紹

    OpenMP是專(zhuān)門(mén)針對(duì)共享地址空間的平行計(jì)算機(jī)提供的并行計(jì)算庫(kù),在Intel C++和Visual C++ 8.0里通過(guò)#pragma支持。用OpenMP,可以不必去寫(xiě)諸如CreateThread
    發(fā)表于 07-22 06:45

    openmp相關(guān)資料下載

    嵌入式算法移植優(yōu)化學(xué)習(xí)筆記1——openmp參考:1、https://www.oschina.net/p/openmp?hmsr=aladdin1e11、openmp簡(jiǎn)介
    發(fā)表于 12-14 09:03

    請(qǐng)問(wèn)JPEG編碼如何并行優(yōu)化?

    使用QT對(duì)Jpeg編碼與解碼功能進(jìn)行優(yōu)化,可以使用openmp,neon等各種方法
    發(fā)表于 05-16 21:25

    OpenMP優(yōu)化調(diào)研系列文章(1)

    Abstract本文調(diào)研了一些對(duì)OpenMP進(jìn)行優(yōu)化的方法:H. Ma, R. Zhao, X. Gao and Y. Zhang針對(duì)OpenMP程序中的barrier提出幾種新功能的支持和性能
    發(fā)表于 10-28 10:18

    OpenMP優(yōu)化調(diào)研系列文章(3)

    本文調(diào)研了4篇與OpenMP優(yōu)化相關(guān)的文獻(xiàn),對(duì)優(yōu)化點(diǎn)分析如下:面向Open64的OpenMP程序優(yōu)化
    發(fā)表于 12-23 16:05

    基于OPENMP多線程技術(shù)的運(yùn)控運(yùn)算優(yōu)化

    聯(lián)邦成員的運(yùn)算效率直接影響整體仿真效率。因此,本文通過(guò)設(shè)計(jì)樂(lè)觀約束判別算法以及基于openMP多線程技術(shù)優(yōu)化該成員的運(yùn)控運(yùn)算方式,提高運(yùn)行效率。實(shí)驗(yàn)表明,改進(jìn)后的運(yùn)控聯(lián)邦成員大幅提高了光學(xué)設(shè)施仿真任務(wù)執(zhí)行效率,仿真聯(lián)
    發(fā)表于 11-07 16:33 ?7次下載
    基于<b class='flag-5'>OPENMP</b>多線程技術(shù)的運(yùn)控運(yùn)算<b class='flag-5'>優(yōu)化</b>

    基于OpenMP的多線程速成課程

    The session introduces multi-threading using OpenMP and explaining the differences between vectorization and multi-threading
    的頭像 發(fā)表于 10-22 06:51 ?1825次閱讀

    基于OF/MPI/OpenMP編程的標(biāo)準(zhǔn)計(jì)算

    with standards-based OpenFabrics Interfaces* (OFI), message passing interface (MPI), and OpenMP* programming methods on Intel? Xeon Phi? processors.
    的頭像 發(fā)表于 09-10 08:22 ?2966次閱讀

    如何在OpenMP中使用嵌套

    此網(wǎng)絡(luò)研討會(huì)討論了使用熱門(mén)團(tuán)隊(duì)在OpenMP中使用嵌套的成功示例,并解釋了利用嵌套并行機(jī)會(huì)的最佳實(shí)踐。
    的頭像 發(fā)表于 11-07 06:52 ?2537次閱讀

    OpenMP如何支持現(xiàn)代CPU工作

    OpenMP *是共享內(nèi)存系統(tǒng)上并行編程的標(biāo)準(zhǔn)。了解它如何支持現(xiàn)代CPU。
    的頭像 發(fā)表于 11-05 07:11 ?3470次閱讀

    一些對(duì)OpenMP進(jìn)行優(yōu)化的方法

    本文調(diào)研了一些對(duì)OpenMP進(jìn)行優(yōu)化的方法。
    的頭像 發(fā)表于 10-18 09:44 ?1650次閱讀