青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

C++ Coder

HCP高性能計算架構,實現,編譯器指令優化,算法優化, LLVM CLANG OpenCL CUDA OpenACC C++AMP OpenMP MPI

C++博客 首頁 新隨筆 聯系 聚合 管理
  98 Posts :: 0 Stories :: 0 Comments :: 0 Trackbacks
http://blog.csdn.net/bendanban/article/details/6303282

在上一節中我們講的是一個常用的并行化編程方法(for的并行化),其實它只是并行化編程的一個特例,只是它的地位較高,或者說它比其它并行化更重要。在本節中我們將討論一般的并行區域編程。

并行區域的編譯指導語句一般格式

    一般格式:#pragma omp parallel [clause[clause]…]{…}

    其中{…}中為每個線程都執行的部分,在parallel后面可以跟隨一些指導子句,例如:threadprivate、copyin等,本節中將以一些實例來依次講解這些語句的作用。

    時刻記住,主線程就是0號線程,這個與for不同,另外private、firstprivate、lastprivate是for并行的東西最好不要拿來比較,盡管我在本文里比較了,但是我還是感覺有些頭痛啊。

例子實例

例1 不帶指導子句的并行程序

      #pragma omp parallel指示它下面的一對大括號內的程序復制執行threads個數次。默默人情況下,所有并行區域中的變量是共享的,所以一定要謹防數據競爭的發生。


 

#include 
#include 
"omp.h" 
int main(int argc, char* argv[]) 

    #pragma omp parallel 
    
for (int i = 0; i < 2; i++
    

        printf(
"Hello World! i = %d, Thread Num = %d/n", i, omp_get_thread_num()); 
    }
 
    
return 0
}

 

image

圖1、例1的執行結果

例1的執行結果可以看出四個線程分別執行了一遍#pragma omp parallel下面的語句,想想一下如果使用#pragma omp parallel for會是什么樣的結果。

例2 使用threadprivate子句

     此命令表示所有并行線程使用指定變量為各自私有的,能被定義為各線程私有變量的變量只能是靜態變量和全局變量。看下面的程序,希望你能發現,其實#pragma omp threadprivate()是可以單獨使用的。

    說明一下:被定義為threadprivate的變量對于每個線程永遠是活的,你在任何時候再次重新啟動各線程時,前面并行時最后得到的變量值仍然保留他的值,如果你用private代替threadprivate,那么你重新啟動各線程時,變量的值仍然為0。如果你不初始化要聲明為private的變量,那么在串行程序中,你就不能再沒有任何賦值的情況下使用它,否則會引起異常的(VS2010)。而且private不能單獨像threadprivate那樣定義某個變量。

    如果你使用另外#pragma omp threadprivate(var),那么var必須是靜態變量或者全局變量,如過你在并行開始之前并沒有初始化賦值,那么每個線程中默認var的值為0.如果你賦了初值,那么每個線程中var的初值都是你賦的初始值。其中主線程就是0號線程。如果你使用了#pragma omp private(var),那么var并不會賦初值,即使你在并行之前賦了初值。想想原先#pragma omp parallel for 的firstprivate就知道了,呵呵。在#pragma omp parallel中可以使用lastprivate,但是不能使用lastprivate,使用firstprivate(var)后,串行部分的var并不是并行時0號線程的var值,它仍未你原先賦的初值。是不是很繞啊?呵呵,你可以這樣理解,使用firstprivate和private的并行都不是純真的聯合主線程的編號。這樣就混不了了。

 

#include 
#include 
"omp.h" 
int sum = 0
#pragma omp threadprivate(sum) 
int main(int argc, char* argv[]) 

    #pragma omp parallel 
    

        sum 
+= omp_get_thread_num(); 
        printf(
"parallel sum = %d; thread num = %d/n", sum, omp_get_thread_num()); 
    }
 
    printf(
"/nserial sum = %d; thread num = %d/n/n", sum, omp_get_thread_num()); 
    #pragma omp parallel 
    printf(
"parallel sum = %d; thread num = %d/n", sum, omp_get_thread_num()); 
    
return 0
}



 

image

圖2、例2執行結果

threadprivate指定了sum這個變量屬于每個線程,每個線程都有自己的sum變量,各個線程結束后他們的sum變量并沒有注銷,在此啊執行時,他們各自的sum值還保持原值。

例3 使用copyin

指定主線程的值拷貝到各線程中去,下面的例子中,sum是每個線程獨有的,并且初始值都是0,main中第一行代碼將0號線程的sum值賦為100,其它線程的sum值并沒有變。

 

#include <stdio.h>
#include 
"omp.h" 
int sum; 
#pragma omp threadprivate(sum) 
int main(int argc, char* argv[]) 

    sum 
= 100
    #pragma omp parallel copyin(sum) 
    

        sum 
+= omp_get_thread_num(); 
        printf(
"parallel sum = %d; thread num = %d/n", sum, omp_get_thread_num()); 
    }
 
    printf(
"/nserial sum = %d; thread num = %d/n/n", sum, omp_get_thread_num()); 
    #pragma omp parallel 
    printf(
"parallel sum = %d; thread num = %d/n", sum, omp_get_thread_num()); 
    
return 0
}



 

image

圖3、例3的執行結果

image

圖4、例3中將copyin(sum)刪除后的執行結果

通過以上圖3、4可以看出copyin的用處是初始化各個線程中自己私有的sum變量。實際上定義sum為全局量時的初始值就是原sum值(如果不使用copyin的話)。

我想了想threadprivate和private以及firstprivate的區別。寫出來大家討論下。

1、threadprivate,限制變量為每個線程私有。被限制的變量必須具有全局特性,他的生命周期是整個程序。

2、private,可以限制變量為每個線程私有,但是他的生命周期是一次啟動并行計算。

3、firstprivate,可以將穿行程序中的初值帶進每個線程,變量為每個線程私有。生命周期與private相同。

4、還有個lastprivate的問題,他并不能在區域并行中使用。

大家實驗把。。。

posted on 2012-10-21 11:55 jackdong 閱讀(384) 評論(0)  編輯 收藏 引用 所屬分類: OPenMP
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲成人资源| 欧美日韩亚洲91| 久久综合久久综合久久综合| 午夜精彩视频在线观看不卡 | 日韩视频在线观看国产| 久久国产欧美日韩精品| 久久精品人人做人人综合| 西西人体一区二区| 久久久久亚洲综合| 欧美高清一区二区| 亚洲黄色成人| 一区二区三区国产在线| 亚洲性xxxx| 久久尤物视频| 欧美成人精品在线播放| 欧美成人国产| avtt综合网| 久久久99精品免费观看不卡| 欧美国产在线电影| 国产精品99久久99久久久二8| 亚洲黄色av一区| 亚洲欧美日韩另类精品一区二区三区 | 久久av资源网| 欧美日本国产一区| 国产一本一道久久香蕉| 亚洲免费不卡| 久久久九九九九| 一本色道婷婷久久欧美| 久久久久久国产精品一区| 欧美三级在线播放| 在线欧美电影| 欧美一区二区三区电影在线观看| 影音先锋另类| 亚洲欧美日韩人成在线播放| 在线看国产日韩| 一区二区三区久久精品| 美女精品国产| 亚洲一区网站| 欧美日韩另类丝袜其他| 欧美日韩精品免费观看| 在线日本高清免费不卡| 欧美肥婆bbw| 亚洲少妇自拍| 欧美日韩国产另类不卡| 亚洲国产成人porn| 久久久在线视频| 在线一区二区日韩| 欧美日韩精品伦理作品在线免费观看| 亚洲福利视频三区| 久久午夜影视| 欧美中文字幕在线播放| 国产精品一页| 亚洲女人av| 亚洲视频狠狠| 国产精品毛片| 国产精品成人免费| 亚洲深夜av| 一本色道久久综合亚洲精品婷婷| 欧美日韩国产一级片| 99国产精品久久久久久久久久| 免费成人av| 久久久久久一区| 一色屋精品亚洲香蕉网站| 久久综合伊人77777麻豆| 激情国产一区二区| 亚洲精品视频一区| 亚洲国产精品视频| 欧美成人一区二区三区片免费| 亚洲大黄网站| 亚洲第一页中文字幕| 欧美高潮视频| 亚洲天堂成人在线观看| 亚洲午夜久久久久久久久电影院 | 免费观看日韩| 久久久久久69| 久久午夜精品一区二区| 亚洲黄色三级| 日韩午夜av| 国产毛片一区二区| 久久尤物视频| 欧美精品乱人伦久久久久久| 亚洲视频在线观看一区| 香蕉乱码成人久久天堂爱免费| 欧美高清在线精品一区| 99成人在线| 国产欧美日韩综合一区在线播放| 久久久久久久久伊人| 另类春色校园亚洲| 亚洲一区二区三区久久| 久久精品人人做人人爽| 久久精品亚洲一区二区三区浴池| 在线电影国产精品| 亚洲精品一区二区三区蜜桃久 | 久久久午夜电影| 嫩草影视亚洲| 国产精品久久999| 久久影院亚洲| 国产精品久99| 欧美黄色影院| 国产麻豆9l精品三级站| 亚洲国产另类久久久精品极度| 欧美日韩亚洲系列| 久久综合狠狠综合久久激情| 欧美日韩精品是欧美日韩精品| 欧美一区二区成人| 亚洲桃色在线一区| 亚洲最新视频在线| 在线精品视频免费观看| 一区二区三区|亚洲午夜| 一区精品在线播放| 亚洲午夜久久久久久尤物| 亚洲精品日韩在线观看| 久久九九精品| 久久精品91| 国产精品久久久久一区二区三区| 欧美第一黄色网| 国产在线精品二区| 亚洲一区尤物| 亚洲午夜av在线| 欧美激情一区二区| 欧美国产精品v| 亚洲欧美日本伦理| 亚洲私人影院| 欧美日韩在线播放三区四区| 久久一区精品| 国产一区视频观看| 亚洲欧美日韩电影| 小处雏高清一区二区三区| 欧美日韩大片一区二区三区| 亚洲第一毛片| 亚洲精品乱码久久久久久蜜桃91 | 一区二区三区免费在线观看| 久久久精品国产一区二区三区| 欧美在线91| 国产精品视频一| 一本久道久久综合婷婷鲸鱼| 亚洲免费播放| 欧美日韩三区四区| 亚洲毛片播放| 亚洲免费网站| 国产精品欧美激情| 亚洲欧美日韩网| 久久精品30| 亚洲国产成人高清精品| 蜜桃av综合| 国产午夜久久| 欧美一区二区三区视频免费播放| 久久久精品性| 最新亚洲一区| 亚洲国产欧美一区二区三区丁香婷| 伊人一区二区三区久久精品| 久久久av网站| 亚洲丰满在线| 亚洲一区二区三区视频| 国产精品一区二区在线观看不卡| 国内精品一区二区三区| 亚洲国产精品久久久久秋霞不卡 | 久久国产一区二区| 免费短视频成人日韩| 亚洲精品在线二区| 欧美日韩午夜在线| 欧美亚洲视频| 亚洲国产高清视频| 亚洲欧美日韩国产一区| 国产噜噜噜噜噜久久久久久久久| 欧美主播一区二区三区| 老司机aⅴ在线精品导航| 日韩亚洲欧美一区| 国产精品久久午夜| 免费不卡亚洲欧美| 一本大道久久a久久精品综合| 欧美午夜不卡在线观看免费 | 一区二区三区日韩欧美精品| 一区二区三区欧美| 欧美在线视频在线播放完整版免费观看| 国产欧美一区二区精品忘忧草| 久久久噜噜噜久久狠狠50岁| 欧美日韩午夜视频在线观看| 亚洲综合日韩在线| 激情综合电影网| 欧美三级第一页| 麻豆成人在线观看| 亚洲一区二区三区四区五区黄| 免费成人av资源网| 欧美自拍偷拍午夜视频| 亚洲免费观看| 影音先锋一区| 国产精品视频一二三| 欧美大片在线看| 欧美在线视频一区| 一区二区三区欧美| 亚洲乱码精品一二三四区日韩在线| 国产麻豆视频精品| 欧美日韩日本网| 欧美大片在线看免费观看| 久久精品亚洲一区| 欧美亚洲尤物久久| 国产精品99久久不卡二区| 亚洲人www| 亚洲国产天堂久久综合网|