資源描述:
《OpenMP程序設(shè)計(jì)》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、OpenMP程序設(shè)計(jì)?什么是OpenMP應(yīng)用編程接口API(ApplicationProgrammingInterface)由三個基本API部分(編譯指令、運(yùn)行部分和環(huán)境變量)構(gòu)成是C/C++和Fortan等的應(yīng)用編程接口?OpenMP使用Fork-Join并行執(zhí)行模型編譯制導(dǎo)OpenMP的#pragma語句的格式為#pragmaompdirective_name…#pragmaomp制導(dǎo)指令前綴。對所有的OpenMP語句都需要這樣的前綴。directive-nameOpenMP制導(dǎo)指令。在制導(dǎo)
2、指令前綴和子句之間必須有一個正確的OpenMP制導(dǎo)指令。并行域結(jié)構(gòu)?并行域中的代碼被所有的線程執(zhí)行?具體格式#pragmaompparallel[clause[[,]clause]…]newline?并行域中的代碼被所有的線程執(zhí)行?具體格式#pragmaompparallel[clause[[,]clause]…]newline共享任務(wù)結(jié)構(gòu)?共享任務(wù)結(jié)構(gòu)將它所包含的代碼劃分給線程組的各成員來執(zhí)行并行for循環(huán)并行sections串行執(zhí)行for編譯制導(dǎo)語句?for語句指定緊隨它的循環(huán)語句必須由線程
3、組并行執(zhí)行;?語句格式#pragmaompfor[clause[[,]clause]…]newlineSections編譯制導(dǎo)語句?sections編譯制導(dǎo)語句指定內(nèi)部的代碼被劃分給線程組中的各線程?不同的section由不同的線程執(zhí)行?Section語句格式:#pragmaompsections[clause[[,]clause]…]newline{[#pragmaompsectionnewline]…[#pragmaompsectionnewline]…}single編譯制導(dǎo)語句?singl
4、e編譯制導(dǎo)語句指定內(nèi)部代碼只有線程組中的一個線程執(zhí)行。?線程組中沒有執(zhí)行single語句的線程會一直等待代碼塊的結(jié)束,使用nowait子句除外?語句格式:#pragmaompsingle[clause[[,]clause]…]newline組合的并行共享任務(wù)結(jié)構(gòu)parallelfor編譯制導(dǎo)語句?Parallelfor編譯制導(dǎo)語句表明一個并行域包含一個獨(dú)立的for語句?語句格式?#pragmaompparallelfor[clause…]newlineparallelsections編譯制導(dǎo)語句
5、?parallelsections編譯制導(dǎo)語句表明一個并行域包含單獨(dú)的一個sections語句?語句格式#pragmaompparallelsections[clause…]newline下面對以上編譯制導(dǎo)語句的類型舉例:1、for編譯制導(dǎo)語句補(bǔ)充Schedule(type[,chunk])?schedule子句描述如何將循環(huán)的迭代劃分給線程組中的線程?如果沒有指定chunk大小,迭代會盡可能的平均分配給每個線程?type為static,循環(huán)被分成大小為chunk的塊,靜態(tài)分配給線程?type為
6、dynamic,循環(huán)被動態(tài)劃分為大小為chunk的塊,動態(tài)分配給線程串行執(zhí)行的程序塊為:for(i=0;;i++)matct();for(j=0;;j++)match();并行的執(zhí)行為:#pragmaompparallel//由并行組里面的線程組并行執(zhí)行{#pragmaompforschedule(static,100)//schedule子句可以省{for(i=0;;i++)match();}#pragmaompforschedule(static,100)//schedule子句可以省{fo
7、r(j=0;;j++)match();}}或者#pragmaompparallelforprivate(i)//parallelfor后面只能跟一個for循環(huán)for(i=0;;i++)//private說明里面的變量i是各自線程私有的match();2、Sections編譯制導(dǎo)語句串行執(zhí)行的程序塊為:for(i=0;i<10000;i++)matct();并行的執(zhí)行為:#pragmaompparallelprivate(i){#pragmaompsections//代碼被劃分給線程組中的各線程{
8、#pragmaompsectionfor(i=0;i<5000;i++)match();#pragmaompsectionfor(i=5000;i<10000;i++)match();}3、single編譯制導(dǎo)語句串行執(zhí)行的程序塊為:for(i=0;;i++)matct();并行的執(zhí)行為:#pragmaompparallel{#pragmaompsingle//代碼只有線程組中的一個線程執(zhí)行。{for(i=0;;i++)match();}}4、實(shí)現(xiàn)線程同步#pragmaompparallel{#