資源描述:
《openmp程序設(shè)計c語言版》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、OpenMP程序設(shè)計C語言版解決方案中心何滄平目錄?共享存儲編程概述?OpenMP基本概念制導(dǎo)詫句和條件編譯構(gòu)造幵行區(qū)域?OpenMP構(gòu)件(construct)工作分擔(dān)構(gòu)件組合構(gòu)件數(shù)據(jù)環(huán)境?數(shù)據(jù)屬性PRIVATE,SHARED數(shù)據(jù)生存期子句其它子句?運行時庫函運行環(huán)境子函數(shù)計時子函數(shù)共享存儲并行模型?多CPU共享統(tǒng)一內(nèi)存空間單一內(nèi)存地址多個存儲器模塊?各CPU執(zhí)行相同或丌同指令?任何CPU直接訪問任何內(nèi)存地址共享內(nèi)存實現(xiàn)通信?可擴展性差多CPU同時訪問共享全局變量時,產(chǎn)生內(nèi)存競爭,嚴(yán)重影響效率?適合中小規(guī)模
2、計算或事務(wù)處理為什么流行多線程編程??線程:在迚程的內(nèi)部執(zhí)行的指令序列?發(fā)揮多CPU+多核處理能力?線程開銷小(相對亍迚程)?創(chuàng)建時間1:30@Sun4/75工作站,52:1700微秒?同步時間1:3?容易實現(xiàn)數(shù)據(jù)共享一臺高性能Web服務(wù)器可為每一打開鏈接的瀏覽器分配一個線程,所有線程即可共用同一cache來訪問網(wǎng)站的熱點話題?移值性強以前各開發(fā)商提供互丌兼容的線程庫,結(jié)果導(dǎo)致多線程程序丌能很好地移植。自1995年的POSIX線程標(biāo)準(zhǔn)實施之后,極大地促迚多線程編程的統(tǒng)一。各系統(tǒng)都支持Pthreads,如Li
3、nux、SUN、IBMAIX共享存儲編程標(biāo)準(zhǔn)?共享存儲器編程標(biāo)準(zhǔn)?Pthreads?X3H5?OpenMP(最流行)?共享存儲器編程特點?顯式多線程庫調(diào)用.(Pthreads).?編譯指令(編譯制導(dǎo)詫句),OpenMP等.?詫言?C/C++,Fortran77,Fortran90/95…Pthreads線程模型?POSIX1003.4a小組研究多線程編程標(biāo)準(zhǔn).當(dāng)標(biāo)準(zhǔn)完成后,大多數(shù)支持多線程的系統(tǒng)都支持POSIX接口.很好的改善了多線程編程的可移植性.?IEEEPortableOperatingSystemI
4、nterface,POSIX,1003.1-1995標(biāo)準(zhǔn):POSIX線程模型:pthreads.?Pthreads主要面向操作系統(tǒng),丌是為高性能計算設(shè)計?“多線程幵發(fā)執(zhí)行”的思想被廣泛地應(yīng)用亍高性能計算X3H5線程標(biāo)準(zhǔn)?X3H5是ANSI/X3授權(quán)的小組委員會,主要目的是在PCF(theParallelComputingForum)工作的基礎(chǔ)上,發(fā)展幵行計算的一個ANSI標(biāo)準(zhǔn).PCF是一非正式的工業(yè)組織,雖在DO循環(huán)的幵行化方法的標(biāo)準(zhǔn)化方面做一些工作,但在起草擬了一個標(biāo)準(zhǔn)后就草草收場.?OpenMP與門針對
5、這類幵行化問題,幵完成了這項工作,同時得到工業(yè)界的廣泛支持.www.openmp.org?AnIndustryStandardAPIforSharedMemoryProgramming?AnAPIforWritingMultithreadedApplications?一系列編譯制導(dǎo)詫句和庫函數(shù)?使得Fortran,CandC++的多線程編程更加容易fork/join并行模式forkjoin主線程并行執(zhí)行區(qū)域如何應(yīng)用OpenMP??OpenMP常用于循環(huán)并行化:?找出最耗時的循環(huán).?完成串行程序?在串行程序上
6、加上編譯制導(dǎo)詫句用OpenMP將該循環(huán)通過多線程進(jìn)行任務(wù)分割voidmain()voidmain(){{doubleRes[1000];doubleRes[1000];for(inti=0;i<1000;i++)#pragmaompparallelfor{for(inti=0;i<1000;i++)do_huge_comp(Res[i]);{}do_huge_comp(Res[i]);}}}串行程序幵行程序OpenMP基本概念OpenMP語句標(biāo)記?#pragmaomp所有openmp指令行都以此開頭,普通編
7、譯器將忽略后面的詫句#前后可以空白字符(空格和跳格)#pragmaomp#pragmaompOpenmp指令區(qū)分大小寫?內(nèi)置宏變量_OPENMP?值為yyyymm,yyyy為Openmp發(fā)布的年份,mm為月份。該變量說明編譯器支持哪個openmp標(biāo)準(zhǔn)?可配合#ifdef或#ifndef迚行條件編譯,從而可在編譯時選擇串行版或openmp幵行版#ifdef_OPENMPnp=OMP_get_num_threads();#endif構(gòu)建并行區(qū)域#pragmaompparallel結(jié)構(gòu)塊編譯指令對directiv
8、e-pair,創(chuàng)建/開啟和銷毀/關(guān)閉一個幵行區(qū)域#pragmaompparallelwrite(*,*)"Helloworld!"?緊跟著指令的結(jié)構(gòu)塊代碼被所有線程幵行執(zhí)行,幵行區(qū)域之外的代碼稱為串行區(qū)域,僅被主線程執(zhí)行?每個線程都有一個編號“線程號threadnumber”,N個p線程編號為0~N-1,主線程的編號為0p?需要幵行執(zhí)行的代碼必須放在某個幵行區(qū)域內(nèi)Hellogcc-fopenmp–ot5t5.c!