版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、123678 問題問題:n主線程等待主線程等待globalvar為真,如不為為真,如不為真則一直循環(huán),這樣占用真則一直循環(huán),這樣占用CPU資源資源n如果主線程等其它線程優(yōu)先級高于如果主線程等其它線程優(yōu)先級高于ThreadFunc,則,則globalvar一直不一直不會被置為真會被置為真9nSetEvent只有一個參數(shù),該參數(shù)指定了事件對象的句柄值,若只有一個參數(shù),該參數(shù)指定了事件對象的句柄值,若事件成功激發(fā),返回事件成功激發(fā),返回TRUE;nResetEvent函數(shù)將事件對象恢復(fù)到最初的非激發(fā)狀態(tài),只有一函數(shù)將事件對象恢復(fù)到最初的非激發(fā)狀態(tài),只有一個參數(shù),成功后返回真?zhèn)€參數(shù),成功后返回真101
2、1p程序輸出如下程序輸出如下: Writing Reading The Program is End12131415161718212223242527282930nlock 關(guān)鍵字將語句塊標(biāo)記為臨界區(qū),方法關(guān)鍵字將語句塊標(biāo)記為臨界區(qū),方法是獲取給定對象的互斥鎖,執(zhí)行語句,然是獲取給定對象的互斥鎖,執(zhí)行語句,然后釋放該鎖。此語句的形式如下:后釋放該鎖。此語句的形式如下:Object thisLock = new Object();lock (thisLock) / Critical code section333435363738394042Master ThreadParalllRegion
3、NestedParallelRegion444546n方便把串行程序改編為并行程序方便把串行程序改編為并行程序48兩種編程方式的優(yōu)缺點兩種編程方式的優(yōu)缺點n編譯指導(dǎo)語句可以實現(xiàn):編譯指導(dǎo)語句可以實現(xiàn):n將串行程序逐步改造成一個并行程序,達到增量更新將串行程序逐步改造成一個并行程序,達到增量更新程序的目的,從而減少編程人員的一定負(fù)擔(dān)。程序的目的,從而減少編程人員的一定負(fù)擔(dān)。n能夠?qū)⒋谐绦蚝筒⑿谐绦虮3衷谕粋€源代碼文件能夠?qū)⒋谐绦蚝筒⑿谐绦虮3衷谕粋€源代碼文件當(dāng)中,減少了維護的負(fù)擔(dān)。當(dāng)中,減少了維護的負(fù)擔(dān)。n編譯指導(dǎo)語句的優(yōu)勢體現(xiàn)在編譯的階段,對于運行階編譯指導(dǎo)語句的優(yōu)勢體現(xiàn)在編譯的階段,
4、對于運行階段支持較少。段支持較少。n運行時庫函數(shù):運行時庫函數(shù):5051n編譯器在鏈接編譯器在鏈接53545657585960616263數(shù)據(jù)相關(guān)的概念數(shù)據(jù)相關(guān)的概念 n如果語句如果語句S2與語句與語句S1存在數(shù)據(jù)相關(guān),那么存在數(shù)據(jù)相關(guān),那么必然存在以下兩種情況之一:必然存在以下兩種情況之一: nS1在循環(huán)的一次迭代中訪問存儲單元在循環(huán)的一次迭代中訪問存儲單元L,而,而S2在隨后的一次迭代中訪問同一存儲單元,即:在隨后的一次迭代中訪問同一存儲單元,即:循環(huán)迭代相關(guān)循環(huán)迭代相關(guān) ;nS1和和S2在同一循環(huán)迭代中訪問同一存儲單元在同一循環(huán)迭代中訪問同一存儲單元L,但,但S1的執(zhí)行在的執(zhí)行在S2之前
5、,即:非循環(huán)迭代相關(guān)之前,即:非循環(huán)迭代相關(guān) 。 數(shù)據(jù)相關(guān)的概念數(shù)據(jù)相關(guān)的概念n實例:實例: x0 = 0; y0 = 1; #pragma omp parallel for private(k) for (k = 1; k 100; k+) xk = yk-1 + 1; /S1 yk = xk-1 + 2; /S2 數(shù)據(jù)相關(guān)的概念數(shù)據(jù)相關(guān)的概念 x0 = 0; y0 = 1; x50 = 75;y50 = 76 ;#pragma omp parallel for private(m, k) for (m = 0; m 2; m+) for (k = m*50 + 1; k m*50 + 50
6、; k+) xk = yk-1 + 1; /S1 yk = xk-1 + 2; /S2 67nthreadprivate表示一個線程私有的全局變量。表示一個線程私有的全局變量。 6869n在一個循環(huán)體內(nèi)經(jīng)常會包含另外一個循環(huán)體,在一個循環(huán)體內(nèi)經(jīng)常會包含另外一個循環(huán)體,循環(huán)產(chǎn)生了嵌套循環(huán)產(chǎn)生了嵌套7071線程1棧線程2棧堆程序代碼程序數(shù)據(jù)n在使用作用域子句的時候要遵循如下的一在使用作用域子句的時候要遵循如下的一些規(guī)則些規(guī)則 :n作用域子句作用的變量是已經(jīng)申明的有名變量作用域子句作用的變量是已經(jīng)申明的有名變量;n作用域子句在作用到類或者結(jié)構(gòu)的時候,必須作用域子句在作用到類或者結(jié)構(gòu)的時候,必須作用到
7、類或者結(jié)構(gòu)的整體,而不能只作用于類作用到類或者結(jié)構(gòu)的整體,而不能只作用于類或者結(jié)構(gòu)的一個部分;或者結(jié)構(gòu)的一個部分;n一個編譯指導(dǎo)語句能夠包含多個數(shù)據(jù)作用域子一個編譯指導(dǎo)語句能夠包含多個數(shù)據(jù)作用域子句,但是變量只能出現(xiàn)在一個作用域子句中,句,但是變量只能出現(xiàn)在一個作用域子句中,即變量不能既是共享的,又是私有的;即變量不能既是共享的,又是私有的;n在語法結(jié)構(gòu)上,作用域子句只能作用在出現(xiàn)在在語法結(jié)構(gòu)上,作用域子句只能作用在出現(xiàn)在編譯指導(dǎo)語句起作用的語句變量部分。另外,編譯指導(dǎo)語句起作用的語句變量部分。另外,可以將作用域子句作用在類的靜態(tài)變量上??梢詫⒆饔糜蜃泳渥饔迷陬惖撵o態(tài)變量上。nOpenMP 對
8、默認(rèn)情況下,并行區(qū)中所有的對默認(rèn)情況下,并行區(qū)中所有的變量都是共享的,但有三種例外情況:變量都是共享的,但有三種例外情況:n在在parallel for循環(huán)中,循環(huán)中,循環(huán)索引變量是私有的是私有的;n那些并行區(qū)中的局部變量是私有的;那些并行區(qū)中的局部變量是私有的;n所有在所有在private,firstprivate,lastprivate或或reduction子句中列出的變量都是私有的。私有子句中列出的變量都是私有的。私有化是通過為每個線程創(chuàng)建各個變量的獨立副本化是通過為每個線程創(chuàng)建各個變量的獨立副本來完成的。來完成的。747576n使用使用reduction子句進行多線程程序設(shè)計時,要記子
9、句進行多線程程序設(shè)計時,要記住以下三個要點:住以下三個要點: n在第一個線程到達指定了在第一個線程到達指定了reduction子句的共享區(qū)域或子句的共享區(qū)域或循環(huán)末尾時,原來的規(guī)約變量的值變?yōu)椴淮_定,并保循環(huán)末尾時,原來的規(guī)約變量的值變?yōu)椴淮_定,并保持此不確定狀態(tài)直至規(guī)約計算完成持此不確定狀態(tài)直至規(guī)約計算完成 ;n如果在一個循環(huán)中使用到了如果在一個循環(huán)中使用到了reduction子句,同時又使子句,同時又使用了用了nowait子句,那么在確保所有線程完成規(guī)約計算的子句,那么在確保所有線程完成規(guī)約計算的柵欄同步操作前,原來的規(guī)約變量的值將一直保持不柵欄同步操作前,原來的規(guī)約變量的值將一直保持不確
10、定的狀態(tài)確定的狀態(tài);n各個線程的私有副本值被規(guī)約的順序是未指定的。因各個線程的私有副本值被規(guī)約的順序是未指定的。因此,對于同一段程序的一次串行執(zhí)行和一次并行執(zhí)行此,對于同一段程序的一次串行執(zhí)行和一次并行執(zhí)行,甚至兩次并行執(zhí)行來說,都無法保證得到完全相同,甚至兩次并行執(zhí)行來說,都無法保證得到完全相同的結(jié)果(這主要針對浮點計算而言),也無法保證計的結(jié)果(這主要針對浮點計算而言),也無法保證計算過程中諸如浮點計算異常這樣的行為會完全相同。算過程中諸如浮點計算異常這樣的行為會完全相同。私有變量的初始化和終結(jié)操作私有變量的初始化和終結(jié)操作n循環(huán)并行化開始時訪問到私有變量在主線程中的循環(huán)并行化開始時訪問到
11、私有變量在主線程中的同名變量的值,也有可能需要將循環(huán)并行化最后同名變量的值,也有可能需要將循環(huán)并行化最后一次循環(huán)的變量結(jié)果返回給主線程中的同名的變一次循環(huán)的變量結(jié)果返回給主線程中的同名的變量。量。nOpenMP 編譯指導(dǎo)語句使用編譯指導(dǎo)語句使用firstprivate和和 lastprivate對這兩種需求進行支持,使得循環(huán)并行對這兩種需求進行支持,使得循環(huán)并行開始執(zhí)行的時候私有變量通過主線程中的變量初開始執(zhí)行的時候私有變量通過主線程中的變量初始化,同時循環(huán)并行結(jié)束的時候,將最后一次循始化,同時循環(huán)并行結(jié)束的時候,將最后一次循環(huán)的相應(yīng)變量賦值給主線程的變量。環(huán)的相應(yīng)變量賦值給主線程的變量。n程
12、序?qū)嵗撼绦驅(qū)嵗?7980在每一個線程的內(nèi)部在每一個線程的內(nèi)部,私有變量私有變量val被初始化被初始化為主線程原有的同名變量的值為主線程原有的同名變量的值,并且在循環(huán)并且在循環(huán)并行化退出的時候并行化退出的時候,相應(yīng)的變量被原有串行相應(yīng)的變量被原有串行執(zhí)行的最后一次執(zhí)行的最后一次執(zhí)行(循環(huán))執(zhí)行(循環(huán))對應(yīng)的值所賦值。對應(yīng)的值所賦值。 81i=0,val(8)i=1,val(8)i=2,val=10000i=3,val=11111i=4,val(11111)82i=0,vali=1,vali=2,vali=3,vali=4,val8384for(int j=1;jN;j+)for(int i=
13、0;iN;i+)ai,j=ai,j+ai,j-1;for(int j=1;jN;j+) #pragma omp parallel forfor(int i=0;iN;i+)ai,j=ai,j+ai,j-1;85n并行區(qū)域編譯指導(dǎo)語句的使用限制并行區(qū)域編譯指導(dǎo)語句的使用限制nparallel編譯指導(dǎo)語句與循環(huán)并行化編譯指導(dǎo)語句與循環(huán)并行化parallel for語句類似,在使用到程序塊之前也有一定的限語句類似,在使用到程序塊之前也有一定的限制。制。n程序塊必須是只有單一入口和單一出口的程序程序塊必須是只有單一入口和單一出口的程序塊塊n不能從外面轉(zhuǎn)入到程序塊的內(nèi)部,也不允許從不能從外面轉(zhuǎn)入到程序塊
14、的內(nèi)部,也不允許從程序塊內(nèi)部有多個出口轉(zhuǎn)到程序塊之外程序塊內(nèi)部有多個出口轉(zhuǎn)到程序塊之外n程序塊內(nèi)部的跳轉(zhuǎn)是允許的程序塊內(nèi)部的跳轉(zhuǎn)是允許的n程序塊內(nèi)部直接調(diào)用程序塊內(nèi)部直接調(diào)用exit函數(shù)來退出整個程序函數(shù)來退出整個程序的執(zhí)行也是允許的的執(zhí)行也是允許的#pragma omp parallelfor(int i=0;i5;i+) printf(hello world i=%dn,i);#pragma omp parallel forfor(int i=0;i5;i+) printf(hello world i=%dn,i);n程序段程序段9的執(zhí)行結(jié)果的執(zhí)行結(jié)果hello world i=0hell
15、o world i=0hello world i=1hello world i=1hello world i=2hello world i=2hello world i=3hello world i=3hello world i=4hello world i=4n程序段程序段10的執(zhí)行結(jié)果的執(zhí)行結(jié)果hello world i=0hello world i=3hello world i=1hello world i=4hello world i=2n并行區(qū)域與循環(huán)并行化的區(qū)別并行區(qū)域與循環(huán)并行化的區(qū)別n并行區(qū)域采用復(fù)制的執(zhí)行方式,將代碼在所有的線程并行區(qū)域采用復(fù)制的執(zhí)行方式,將代碼在所有的線程內(nèi)
16、部都執(zhí)行一次內(nèi)部都執(zhí)行一次n循環(huán)并行化采用工作分配的執(zhí)行方式,將循環(huán)所需要循環(huán)并行化采用工作分配的執(zhí)行方式,將循環(huán)所需要所有工作量按照一定的方式分配到各個執(zhí)行線程中,所有工作量按照一定的方式分配到各個執(zhí)行線程中,所有線程執(zhí)行工作的總和是原先串行執(zhí)行所完成的工所有線程執(zhí)行工作的總和是原先串行執(zhí)行所完成的工作量。作量。n并行區(qū)域并行區(qū)域parallel語句的作用:語句的作用:n當(dāng)程序遇到當(dāng)程序遇到parallel編譯指導(dǎo)語句時,就會生成相應(yīng)數(shù)編譯指導(dǎo)語句時,就會生成相應(yīng)數(shù)目(根據(jù)環(huán)境變量)的線程,且組成一個線程組,并目(根據(jù)環(huán)境變量)的線程,且組成一個線程組,并將代碼重復(fù)地在各個線程內(nèi)部執(zhí)行。將代
17、碼重復(fù)地在各個線程內(nèi)部執(zhí)行。Parallel的末尾隱的末尾隱含一個同步障礙,所有線程完成各自的任務(wù)后將在這含一個同步障礙,所有線程完成各自的任務(wù)后將在這個同步障礙匯合。此時,此線程組的主線程個同步障礙匯合。此時,此線程組的主線程(master)繼繼續(xù)執(zhí)行,而相應(yīng)的子線程續(xù)執(zhí)行,而相應(yīng)的子線程(slave)則停止執(zhí)行。則停止執(zhí)行。90int counter=0; /using threadprivate#pragma omp threadprivate(counter) void inc_counter()()counter+; int _tmain(int argc, TCHAR * argv
18、)#pragma omp parallel for(int i=0;i10000;i+)inc_counter()();printf(counter=%dn,counter); 91int global=0;#pragma omp threadprivate(global)int _tmain(int argc, TCHAR * argv)global=1000;#pragma omp parallel copyin(global) printf(global=%dn,global); global=omp_get_thread_num()(); printf(global=%dn,globa
19、l);printf(parallel againn);#pragma omp parallelprintf(global=%dn,global); 92并行區(qū)域之間的工作共享并行區(qū)域之間的工作共享程序程序13int next_task=0; int get_next_task() int task; #pragma omp criticalif(next_task8) task=next_task; next_task+; else task=-1; return task; void task_queue()() int my_task; #pragma omp parallel priva
20、te(my_task) my_task=get_next_task()(); while(my_task!=-1) get_task_done(my_task); my_task=get_next_task()(); 并行區(qū)域之間的工作共享并行區(qū)域之間的工作共享n根據(jù)線程號分配任務(wù):由于每一個線程在根據(jù)線程號分配任務(wù):由于每一個線程在執(zhí)行的過程中的線程標(biāo)識號是不同的,可執(zhí)行的過程中的線程標(biāo)識號是不同的,可以根據(jù)這個線程標(biāo)識號來分配不同的任務(wù)以根據(jù)這個線程標(biāo)識號來分配不同的任務(wù)。#pragma omp parallel private(myid) nthreads=omp_get_num_thr
21、eads(); myid=omp_get_thread_num(); get_my_work_done(myid,nthreads); 95969899100101102103 int counter=0; #pragma omp parallel for(int i=0;i10000;i+) #pragma omp atomic /atomic operation counter+; printf(counter = %dn,counter);104105106107omp_lock_t lock; /對應(yīng)程序?qū)嵗龑?yīng)程序?qū)嵗?int counter=0;void inc_counter()
22、 printf(thread id=%dn,omp_get_thread_num(); for(int i=0;i100000;i+) omp_set_nest_lock(&lock); counter+; omp_unset_nest_lock(&lock); 108 #pragma omp for #pragma omp sections109 #pragma omp parallel #pragma omp for nowait for(int i=0;i9;+i) xi=(yi+zi)/2; printf(i=%d thread=%dn,i,omp_get_thread
23、_num(); printf(finishedn); 110 #pragma omp parallel initialization ( ) ; #pragma omp barrier; process ( ) ; 111 #pragma omp ordered #pragma omp parallel for ordered schedule(dynamic)112void work(int k) printf(thread id =%d k=%dn,omp_get_thread_num(),k); #pragma omp ordered printf( %dn, k); void orde
24、red_func(int lb, int ub, int stride) int i; #pragma omp parallel for ordered schedule(dynamic) for (i=lb; i10) printf(“if clause, ThreadId=%dn”, omp_get_thread_num(); 如果如果n10,則大括號內(nèi)代碼并行執(zhí)行;,則大括號內(nèi)代碼并行執(zhí)行;如果如果n2*ncore?2*ncore:max_tn;/實實際線程數(shù)量際線程數(shù)量119Schedule子句:子句:n格式:格式:schedule(type,size)ntype參數(shù):參數(shù):dynam
25、ic/guided/runtime/staticnsize參數(shù):表示循環(huán)迭代次數(shù),必須為整數(shù)。參數(shù):表示循環(huán)迭代次數(shù),必須為整數(shù)。n如果如果type參數(shù)為參數(shù)為dynamic/guided/static,則,則size為為可選參數(shù)可選參數(shù)n如果如果type參數(shù)為參數(shù)為runtime,則不需要使用,則不需要使用size參數(shù)。參數(shù)。120Schedule子句:子句:n靜態(tài)調(diào)度靜態(tài)調(diào)度(static):parallel for語句不帶語句不帶schedule子句,默認(rèn)為靜態(tài)調(diào)度方式。子句,默認(rèn)為靜態(tài)調(diào)度方式。n動態(tài)調(diào)度動態(tài)調(diào)度(dynamic):沒有:沒有size參數(shù):將迭代逐參數(shù):將迭代逐個分配到
26、各個線程;使用個分配到各個線程;使用size參數(shù):每次分配參數(shù):每次分配給線程的迭代次數(shù)為給線程的迭代次數(shù)為size次。次。n啟發(fā)式自調(diào)度啟發(fā)式自調(diào)度(guided):開始時每個線程會分:開始時每個線程會分配到較大的迭代塊,之后分配到的迭代塊會遞配到較大的迭代塊,之后分配到的迭代塊會遞減。迭代塊的大小按指數(shù)級下降到指定的減。迭代塊的大小按指數(shù)級下降到指定的size大小。如果沒有大小。如果沒有size參數(shù),默認(rèn)參數(shù),默認(rèn)1。121122int _tmain(int argc, _TCHAR* argv) _int64 frequency; _int64 counter; _int64 begin; _int64 end; QueryPerformanceFrequency(
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年個人房產(chǎn)租賃管理服務(wù)協(xié)議
- 2025年鐵件掛件行業(yè)深度研究分析報告
- 2025年度綠色能源信托資金借款合同協(xié)議2篇
- 《消防安全教育普及》課件
- 2025年個人門面房租賃合同包含租賃保證金及返還流程2篇
- 2025年湖南長城銀河科技有限公司招聘筆試參考題庫含答案解析
- 2025年消防演練場地搭建與實施合同范本2篇
- 2025個人股份無償轉(zhuǎn)讓與公司戰(zhàn)略調(diào)整服務(wù)協(xié)議4篇
- 2025年廣東潮州潮安區(qū)商業(yè)總公司招聘筆試參考題庫含答案解析
- 2025年貴州湄潭湄江工業(yè)投資集團招聘筆試參考題庫含答案解析
- 《鐵路軌道維護》課件-更換道岔尖軌作業(yè)
- 股份代持協(xié)議書簡版wps
- 職業(yè)學(xué)校視頻監(jiān)控存儲系統(tǒng)解決方案
- 《銷售心理學(xué)培訓(xùn)》課件
- 智能養(yǎng)老院視頻監(jiān)控技術(shù)方案
- 2024年安徽省公務(wù)員錄用考試《行測》真題及解析
- 你比我猜題庫課件
- 豐順縣鄉(xiāng)鎮(zhèn)集中式飲用水水源地基礎(chǔ)狀況調(diào)查和風(fēng)險評估報告
- 無人駕駛航空器安全操作理論復(fù)習(xí)測試附答案
- 2024年山東省青島市中考語文試卷(附答案)
- 職業(yè)技術(shù)學(xué)?!犊缇畴娮由虅?wù)物流與倉儲》課程標(biāo)準(zhǔn)
評論
0/150
提交評論