并行計(jì)算工具OpenMP 二

如果你想要變量是每個(gè)線程擁有自己的單獨(dú)的變量梯醒,那么就在并行塊里面定義變量宽堆,對于在進(jìn)入并行塊前已經(jīng)定義了的變量,是在多個(gè)線程之間共享的茸习,需要小心處理畜隶,否則程序不會按照我們想要的方式執(zhí)行。

并行塊前定義變量

在上面這個(gè)程序中号胚,試圖用sum來累加變量和籽慢。#pragma omp parallel for告訴編譯器要把這個(gè)for語句拆開來并行執(zhí)行猫胁。注意 sum 定義在并行塊外面弃秆,所以在并行塊中會共享這個(gè)變量。也就是說在四個(gè)核中用的是同一個(gè)變量盼樟,對于sum + = i 語句晨缴,是先把sum的值取出來和 i 相加后再把結(jié)果賦給sum變量峡捡。既然四個(gè)線程用的是同一個(gè)sum,那么如果sum在線程0中取出來了阁吝,另一個(gè)線程中也同時(shí)取出來了同樣值的sum械拍,加完后值在兩個(gè)線程中都會被送就回到sum坷虑,那么就會造成有一次操作被重寫了(數(shù)據(jù)碰撞),也就是說最后的結(jié)果很可能小于正確的結(jié)果定躏。(實(shí)際上我在visual studio2019上運(yùn)行上面的代碼并沒有出錯(cuò)芹敌,但是不排除是因?yàn)関s進(jìn)行了更正操作)結(jié)果如下:

并行結(jié)果

為了避免上面中出現(xiàn)的情況碧聪,可以進(jìn)行一些其他操作:比如可以在 sum += i; 前面加上#pragma omp critical 語句液茎,這條語句是告訴編譯器下面的代碼塊很關(guān)鍵豁护,任何時(shí)刻都只能有一個(gè)線程執(zhí)行該代碼塊欲间。不過這樣的話代碼會在多個(gè)核中的運(yùn)行會相互影響猎贴,對性能有一定影響她渴,最好的解決方法是用規(guī)約reduction,代碼如下圖:

規(guī)約reduction代碼

reduction (+:sum) 告訴編譯器,這并行塊要用規(guī)約满葛,+表示求和操作,sum是目標(biāo)變量名篇亭。這樣的話译蒂,編譯器就會給每個(gè)線程一個(gè)sum的拷貝并正確初始化為0谊却,然后每個(gè)線程執(zhí)行完之后再合并因惭。規(guī)約只適用于固定的操作符。

規(guī)約后代碼的結(jié)果

OpenMP支持的規(guī)約操作符如下圖:

規(guī)約操作符

如果我們不想要已經(jīng)定義了的變量在多個(gè)線程中共享,想要讓每個(gè)線程有自己的拷貝怎么辦呢乒躺?下面就簡單介紹一個(gè)private從句嘉冒,以及firstprivate和lastprivate咆繁。通過使用#pragma omp parallel private(variable list),告訴編譯器在下面的并行塊中每個(gè)線程都對variable list列出的變量進(jìn)行拷貝。不過值得注意的時(shí)坏为,每個(gè)線程中拷貝的變量的初始值是不確定的匀伏,執(zhí)行完并行塊后該變量的值也不確定。所以就有了firstprivate和lastprivate熙侍,firstprivate 是說變量的初始值就是按照該變量進(jìn)入并行塊之前的值初始化蛉抓;lastprivate 是說退出并行塊后芝雪,按照串行情況最后的一個(gè)值給到主線程中的變量。如果同時(shí)使用firstprivate和lastprivate位岔,那么該變量就會有和串行是一樣的初始值和結(jié)束值抒抬。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末擦剑,一起剝皮案震驚了整個(gè)濱河市惠勒,隨后出現(xiàn)的幾起案子纠屋,更是在濱河造成了極大的恐慌盾计,老刑警劉巖署辉,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件哥攘,死亡現(xiàn)場離奇詭異刚夺,居然都是意外死亡侠姑,警方通過查閱死者的電腦和手機(jī)莽红,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進(jìn)店門安吁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鬼店,“玉大人妇智,你說我怎么就攤上這事』蟪耄” “怎么了航徙?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵杠袱,是天一觀的道長霞掺。 經(jīng)常有香客問我菩彬,道長骗灶,這世上最難降的妖魔是什么耙旦? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮绕娘,結(jié)果婚禮上险领,老公的妹妹穿的比我還像新娘。我一直安慰自己挨下,他們只是感情好臭笆,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著帜讲,像睡著了一般似将。 火紅的嫁衣襯著肌膚如雪在验。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天,我揣著相機(jī)與錄音授艰,去河邊找鬼淮腾。 笑死谷朝,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的送朱。 我是一名探鬼主播驶沼,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了复旬?” 一聲冷哼從身側(cè)響起驹碍,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤嚼酝,失蹤者是張志新(化名)和其女友劉穎钧舌,沒想到半個(gè)月后延刘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡撼班,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年砰嘁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了件炉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,643評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡矮湘,死狀恐怖斟冕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情缅阳,我是刑警寧澤磕蛇,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站十办,受9級特大地震影響秀撇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜向族,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一呵燕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧件相,春花似錦虏等、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至侯养,卻和暖如春敦跌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背逛揩。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工柠傍, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人辩稽。 一個(gè)月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓惧笛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親逞泄。 傳聞我的和親對象是個(gè)殘疾皇子患整,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,092評論 1 32
  • OpenMP2.5 有底層API后,就已經(jīng)可以實(shí)現(xiàn)并行編程喷众;然而各谚,很多時(shí)候串行算法已經(jīng)成型,如果繼續(xù)使用原有的底層...
    一夢換須臾_閱讀 1,393評論 0 0
  • 本篇文章只是記錄api的用法和回顧到千,方便記憶 openMP openMP提供“基于指令”的共享內(nèi)存API昌渤。這就意味...
    Gavinjou大笨象閱讀 13,283評論 0 7
  • What's OpenMP The OpenMP API supports multi-platform shar...
    bitzoo閱讀 2,823評論 0 0
  • 人生第一次技術(shù)面試:緊張到拿到面試通知到面試那天都無法呼吸寫代碼:兩個(gè)題,兩個(gè)題的答案等我今晚補(bǔ)上 一次遍歷憔四,鏈表...
    Allen的光影天地閱讀 2,204評論 0 0